Swift - TableView степперов, щелкните один степпер в ячейке, и активируются другие степперы?

Я новичок в IOS, и в основном у меня есть tableView, и всякий раз, когда он имеет 40 ячеек, и каждая ячейка имеет степпер и метку. метка отображает значение шагового двигателя. Табличное представление генерирует ячейки в порядке, но проблема в том, что всякий раз, когда я нажимаю степпер в одной ячейке, некоторые другие случайные ячейки также активируют свои степперы. Кстати, это быстро. Вот код ячейки:

import UIKit

class StudentTableViewCell: UITableViewCell {
@IBOutlet weak var studentNameAndValue: UILabel!
@IBOutlet weak var studentValueChanger: UIStepper!

let name:String?
let value:Int?
override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}
@IBAction func stepperValueChanged(sender: AnyObject) {
    studentNameAndValue.text = "\(name): \(Int(studentValueChanger.value))"
}

}

Вот код для контроллера представления:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    tableView.delegate = self
    tableView.dataSource = self
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 40
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("studentCell") as StudentTableViewCell
    return cell
}
}

person dhruvm    schedule 16.02.2015    source источник


Ответы (1)


Проблема в вашем контроллере табличного представления. Было бы лучше поместить туда метод изменения значения. В качестве альтернативы просмотрите свой метод cellForRowAtIndexPath. Вы неправильно обновляете ячейки, когда они перерабатываются.

Вы должны явно установить значение шагового двигателя и метки в cellForRowAtIndexPath. Вы не можете прочитать эти значения из ячейки - они должны быть в вашем datasource (т.е. контроллер табличного представления должен знать, что отображать для данного пути индекса).

Подключите шаговый обработчик к методу в контроллере представления, затем укажите правильный путь индекса с помощью аргумента sender.

@IBAction func stepperChanged(sender: UIStepper) {
    let point = sender.convertPoint(CGPointZero, toView: tableView)
    let indexPath = self.tableView.indexPathForRowAtPoint(point)!
    let myData = dataArray[indexPath.row] // or whatever your datasource
    // if you need to update the cell
    let cell = self.tableView.cellForRowAtIndexPath(indexPath)
}
person Mundi    schedule 16.02.2015
comment
как бы я поместил метод изменения значения в контроллер табличного представления и подключил его к фактическому степперу и метке? - person dhruvm; 16.02.2015
comment
Подключите его в раскадровке из ячейки прототипа. В обработчике вы можете определить sender. Я добавлю код в свой ответ, чтобы продемонстрировать. - person Mundi; 16.02.2015
comment
но если мы подключаем степпер и метку внутри контроллера представления, нам придется соединить их внутри метода cellForRowAtIndexPath. Правильно? - person dhruvm; 16.02.2015
comment
Нет. Шаговый двигатель уже является частью ячейки, удаленной из очереди. Вы соединяете их в раскадровке. - person Mundi; 16.02.2015
comment
хорошо. поэтому мне не нужно помещать метод stepperChanged внутри cellForRowAtIndexPath, потому что я уже могу получить точку с помощью отправителя - person dhruvm; 16.02.2015
comment
Это все еще не работает. Когда вместо этого я добавил метод stepperChanged в контроллер представления, он сработал, но другие метки из других ячеек также изменились. - person dhruvm; 16.02.2015
comment
вот как выглядел метод для тестирования: - person dhruvm; 16.02.2015
comment
@IBAction func stepperChangerMethod(sender: UIStepper) { let point = sender.convertPoint(CGPointZero, toView: tableView) let indexPath = self.tableView.indexPathForRowAtPoint(point) let cell = self.tableView.cellForRowAtIndexPath(indexPath!) как ячейка StudentTableViewCell. studentNameAndValue.text = } - person dhruvm; 16.02.2015
comment
Вы изменили метод cellForRowAtIndexPath? - person Mundi; 16.02.2015
comment
Я не могу поместить IBAction внутри метода cellForRowAtIndexPath, это дает мне ошибку, я должен поместить IBAction вне cellForRowAtIndexPath - person dhruvm; 16.02.2015
comment
как должен выглядеть мой метод cellForRowAtIndexPath? - person dhruvm; 16.02.2015
comment
Хорошо, помедленнее. Если вы пробовали это, вы не поняли, как работает архитектура. Пожалуйста, внимательно прочитайте эту ветку пару раз и, возможно, обратитесь к документации по упомянутым методам. Затем попытайтесь реализовать его осторожно, наблюдая за тем, что вы узнали. Затем, после того, как вы закончите с этим, снова отправьте сообщение в эту тему, если вам нужна помощь. - person Mundi; 16.02.2015