Swift - 步进器的TableView,单击一个单元格中的一个步进器,其他步进器被激活?

时间:2015-02-16 19:29:18

标签: uitableview swift uistepper

我是IOS的新手,基本上我有一个tableView,每当它有40个单元格,每个单元格都有一个步进器和一个标签。标签显示步进器的值。 tableview生成细胞很好,但问题是每当我在一个单元格中单击步进器时,其他一些随机单元也会激活它们的步进器。顺便说一下,这很快。这是单元格的代码:

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))"
}

}

以下是viewcontroller的代码:

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
}
}

1 个答案:

答案 0 :(得分: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)
}