Swift两个表视图单元格获得相同的值

时间:2016-05-19 13:57:49

标签: swift tableviewcell

我在视图控制器上使用了包含16个单元格的tableview。每个单元格都有一个文本字段和一个选择器视图作为textfield的输入视图。奇怪的是,当我选择第一个单元格的值时,它很好。当我向下滚动到最后一个单元格时,该值与第一个单元格相同。但我从来没有接触到最后一个细胞。为什么会这样?

Sheet1

两天后,它通过数千次试验解决了:

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
{
    // selected value in Uipickerview in Swift
    answerText.text = pickerDataSource[row]
    answerText.tag = row
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = myTable.dequeueReusableCellWithIdentifier("addFollowCell", forIndexPath: indexPath) as! AddFollowTableViewCell
    cell.questionView.text = listQuestion1[indexPath.row]
    cell.pickerDataSource = dictPicker[indexPath.row]!
    cell.answerText.addTarget(self, action: #selector(AddFollowUpViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingDidEnd)
    return cell
}

func textFieldDidChange(sender: UITextField){
    let rowIndex: Int!
    let selectValue = sender.tag

    if let txtf = sender as? UITextField {
        if let superview = txtf.superview {
            if let cell = superview.superview as? AddFollowTableViewCell {
                rowIndex = myTable.indexPathForCell(cell)?.row
                dictAnswer[rowIndex] = selectValue - 1
            }
        }
    }
}

可能需要优化一些性能问题,但它确切地显示了我想要的内容。 LOL

2 个答案:

答案 0 :(得分:2)

您基本上是回收您的观点而不是清除它们。这就是-dequeueReusableCellWithIdentifier:indexPath:

的重点

分配和释放内存非常耗电,因此系统会回收每个超出视口范围的单元格。

您没有在answerText 中设置文字(我认为它是导致问题的文字字段)因此其内容将在回收时保留。< / p>

假设您将用户选择存储在字典var selectedAnswerForRow: [IndexPath:String]中:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    let cell = myTable.dequeueReusableCellWithIdentifier("addFollowCell", forIndexPath: indexPath) as! AddFollowTableViewCell
    cell.questionView.text = listQuestion1[indexPath.row]
    cell.pickerDataSource = dictPicker[indexPath.row]!
    cell.answerText.addTarget(self, action: "textFieldDidChange:"), forControlEvents: UIControlEvents.EditingDidEnd)
    cell.answerText.text = self.selectedAnswerForRow[indexPath] ?? "" // add this
    return cell
}

self.selectedAnswerForRow[indexPath] ?? ""会返回结果,如果字典中没有该字符串,则返回空字符串。

此外,您还要为版本控制事件多次添加操作。如果它还没有被绑定,你必须先检查。

答案 1 :(得分:0)

因为细胞被重复使用。因此,您必须在自定义单元格类中实现prepareForReuse()并重置所有更改变量

<强>更新

见:

class MyCell : UITableViewCell {

    @IBOutlet weak var myTextField : UITextField!

    //Add the following
    override func prepareForReuse() {
    myTextField.text = nil
    myTextField.inputView = myPickerView
    super.prepareForReuse()
   }
}