Swift 2.0,UITableView:cellForRowAtIndexPath为非可见单元格返回nil

时间:2015-10-08 09:23:06

标签: ios swift uitableview swift2 ios9

请不要将此标记为重复的问题,因为我找不到适合我的查询的答案。

我有一个包含文本字段的单元格的表格视图。我在屏幕底部有一个按钮。行数大于屏幕可以显示的行数,因此某些单元格不在视图中。我希望在按下按钮的任何时候,都会读取所有文本字段并处理文本输入。我无法这样做,因为显然由于单元格的可重用性,根本不存在视图中的单元格,而那些indexPaths的cellForRowAtIndexPath会产生运行时错误。我已经阅读了答案,说这根本无法完成。但我发现很难相信没有解决方法。请帮忙。提前谢谢!

3 个答案:

答案 0 :(得分:2)

由于(至少)性能和内存的原因,这肯定不会无法(访问屏幕外的单元格或实现允许它的变通方法)的使用。

已经说过,正如你所说,有一个解决方法。您需要做的是更改在这些文本字段中存储值的方式。您可以将每个字段的文本存储在集合中,而不是遍历单元格并直接从文本字段中检索文本。

  1. 在表视图控制器/数据源上定义字典属性,以保存每行的文本。
  2. 充当UITextField的代表,并在tableView:cellForRowAtIndexPath:
  3. 中进行指定
  4. 实现textField:didEndEditing:(或适用于您的用例的任何内容),并将文本存储在与包含该文本字段的单元格相关的索引路径中键入的字典中。
  5. 更新按钮操作方法以使用此字典而不是遍历单元格。

答案 1 :(得分:1)

创建一个UITableViewCell子类,为tableViewCells添加一个索引属性并引入一个委托:

protocol CustomCellDelegate {
   func didEditTextField(test : String, atIndex : Int)  
}

在UITableViewCell子类上创建委托变量。

var delegate : CustomCellDelegate?

在tableViewCell中实现UITextViewDelegate,并将单元格设置为文本字段的委托。

实施这两种方法:

 func textFieldShouldReturn(textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
  }

 func textFieldDidEndEditing(textField : UITextField) {
     // call back with the delegate here
     // delegate?.didEditTextField(textfield.text, atIndex: self.index)
 }

因此,当用户结束编辑textField时,您的单元格将使用委托调用,发送文本和索引。

在viewController上,当你初始化tableViewCell时,将单元格的委托设置为viewController,并将索引设置为indexPath.row。

在viewController上设置一个String数组,其中包含尽可能多的tableViewCells项。使用空字符串初始化数组。

所以你在viewController上得到了委托,无论何时调用它,你只需将返回的文本插入到viewcontroller的字符串数组中的右索引处。

有什么想法,这会有效吗?

答案 2 :(得分:0)

如果我们可以假设创建了 NEVER 的单元格没有文本输入,那么自己创建ArraySet并在那里克隆内容/输入文本用户输入到单元格的文本字段。

每当单击该按钮时,您可以迭代数组而不是单元格以获取所有输入。

虽然这有点太烂了..