Ios tableView.cellForRowAtIndexPath返回nil,单元格过多(swift)

Ios tableView.cellForRowAtIndexPath返回nil,单元格过多(swift),ios,swift,tableview,Ios,Swift,Tableview,所以我有一件最奇怪的事 我正在循环一个tableView,以便遍历所有单元格。对于少于5个单元格,它可以正常工作,但对于更多单元格,它会因“意外发现零”而崩溃。代码如下: for section in 0..<tableView.numberOfSections { for row in 0..<tableView.numberofRowsInSection(section) { let indexPath = NSIndexPath(forRow

所以我有一件最奇怪的事

我正在循环一个tableView,以便遍历所有单元格。对于少于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

对于0..中的节,因为单元格被重用,所以只有当给定indexPath的单元格当前可见时,CellForRowatineXpath才会为您提供单元格。它由可选值指示。如果要防止崩溃,应该使用If-let

if let cell = tableView?.cellForRowAtIndexPath(indexPath) as? MenuItemTableViewCell {
     // Do something with cell
}
如果要更新单元格中的值,单元格应更新数据源项。例如,您可以为此创建委托

protocol UITableViewCellUpdateDelegate {
    func cellDidChangeValue(cell: UITableViewCell)
}
将委托添加到您的单元格中,并假设此单元格中有一个文本字段。我们为EditingDidChange事件添加了
didCHangeTextFieldValue:
的目标,因此每次用户在其中键入somethink时都会调用它。当他这样做时,我们调用委托函数

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)
    }
}
然后在
cellforrowatinexpath
中添加代理

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

}

希望有帮助

为什么要迭代单元格?您的数据源中应该已经有了所有单元格数据。如果当前没有为该路径分配单元格,CellForRowatineXpath可能会返回nil。例如,屏幕外的行。正如@rmaddy所说,您可能不需要这样做。不要将您在此处调用的tableview方法与您将要实现的数据源方法混淆CellForRowatinex返回可选,因为该单元格可能尚未像rmaddy所说的那样创建,所以如果让…您是对的,请尝试。问题可能是看不见的细胞。那么,我该如何循环数据源呢?(抱歉,这里是swift/xcode新手。)Thx这对我有帮助,但我仍然需要一些更清晰的信息。我是在单元格中还是在viewController中创建(协议)委托?另外,我想监控每个单元格中的数量,这样我可以将委托类型设置为Int而不是单元格吗?或者我仍然需要单元格类型,以便在出列时获得每个单元格的id?