tableView.cellForRowAtIndexPath返回零,太多的单元格(swift)

所以我有最奇怪的事情

我正在循环tableView以遍历所有单元格。 它工作正常与less于5个单元格,但崩溃与“意外发现无”更多的单元格。 代码如下:

for section in 0..<tableView.numberOfSections { for row in 0..<tableView.numberofRowsInSection(section) { let indexPath = NSIndexPath(forRow: row, inSection: section) let cell = tableView?.cellForRowAtIndexPath(indexPath) as? MenuItemTableViewCell // extract cell properties 

最后一行是给出错误的那一行。

有什么想法吗?

因为单元格被重用,所以cellForRowAtIndexPath只会在给定indexPath的单元格当前可见的情况下给你单元格。 它由可选值表示。 如果你想防止崩溃,你应该使用,如果让

 if let cell = tableView?.cellForRowAtIndexPath(indexPath) as? MenuItemTableViewCell { // Do something with cell } 

如果你想更新单元格的值,你的单元格应该更新dataSource项目。 例如,你可以为它创build委托

 protocol UITableViewCellUpdateDelegate { func cellDidChangeValue(cell: UITableViewCell) } 

将委托添加到您的单元格,并假设我们在这个单元格中有一个textField。 我们为didCHangeTextFieldValue:添加目标didCHangeTextFieldValue:用于EditingDidChange事件,以便每当用户键入somethink时调用它。 而当他这样做时,我们称之为委托function。

 class MyCell: UITableViewCell { @IBOutlet var textField: UITextField! var delegate: UITableViewCellUpdateDelegate? override func awakeFromNib() { textField.addTarget(self, action: Selector("didCHangeTextFieldValue:"), forControlEvents: UIControlEvents.EditingChanged) } @IBAction func didCHangeTextFieldValue(sender: AnyObject?) { self.delegate?.cellDidChangeValue(cell) } } 

然后在cellForRowAtIndexPath添加委托

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("MyCellIdentifier", forIndexPath: indexPath) cell.delegate = self return cell } 

最后我们实现委托方法:

 func cellDidChangeValue(cell: UITableViewCell) { guard let indexPath = self.tableView.indexPathForCell(cell) else { return } /// Update data source - we have cell and its indexPath } 

希望能帮助到你