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 }
希望能帮助到你