我在视图控制器上使用了包含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
答案 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()
}
}