tableView.cellForRow(at:IndexPath(row:0,section:0))尽管滚动到tableView顶部但仍返回nil

时间:2018-01-26 15:34:11

标签: ios swift xcode

使用Xcode ver 9.2,Swift开发iOS应用程序。

当点击RightNavigationButtonAdd时,我想在TableView的开头插入一个TableViewCell,并将其中的TextField作为焦点(becomeFirstResponder)。

当插入的TableViewCell可见时,它可以正常工作。但是,当插入的TableViewCell不可见时,由于cellForRow返回nil而发生错误。

你能告诉我如何解决这个问题吗?

@objc func RightNavigationButtonAdd(_ sender: UIBarButtonItem) {
    // array is ["aaa", "bbb", "ccc", "ddd", ...]
    array.insert("", at: 0)
    // ttableView is @IBOutlet var ttableView: UITableView!
    ttableView.insertRows(at: [IndexPath(row:0, section:0)], with: .top)
    // Scroll to top of tableView
    UIView.animate(withDuration: 0.3, animations: {
        self.ttableView.scrollToRow(at: IndexPath(row:0, section:0), at: .top, animated: true)
    }, completion: { finished in
        // when inserted cell is not visible, error occured:
        // "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
        let cell = self.ttableView.cellForRow(at: IndexPath(row:0, section:0)) as! TableViewCell
        cell.textField.becomeFirstResponder()
        cell.textField.placeholder = "input anything ..."
    })
}

更新

我不知道为什么,但如果滚动动画:" false",它运作正常!

@objc func RightNavigationButtonAdd(_ sender: UIBarButtonItem) {
    // array is ["aaa", "bbb", "ccc", "ddd", ...]
    array.insert("", at: 0)
    // ttableView is @IBOutlet var ttableView: UITableView!
    ttableView.insertRows(at: [IndexPath(row:0, section:0)], with: .top)
    // Scroll to top of tableView
    UIView.animate(withDuration: 0.3, animations: {
        self.ttableView.scrollToRow(at: IndexPath(row:0, section:0), at: .top, animated: false)
    }, completion: { finished in
        // when inserted cell is not visible, error occured:
        // "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
        let cell = self.ttableView.cellForRow(at: IndexPath(row:0, section:0)) as! TableViewCell
        cell.textField.becomeFirstResponder()
        cell.textField.placeholder = "input anything ..."
    })
}

1 个答案:

答案 0 :(得分:0)

如果你想获得一个可见的单元格,你应该这样做

let cell =  self.ttableView.visibleCells[0]

然后您可以检查单元格是否存在,或者检查self.ttableView.visibleCells的大小,您可以选择。

所以最后

@objc func RightNavigationButtonAdd(_ sender: UIBarButtonItem) {
// array is ["aaa", "bbb", "ccc", "ddd", ...]
array.insert("", at: 0)
// ttableView is @IBOutlet var ttableView: UITableView!
ttableView.insertRows(at: [IndexPath(row:0, section:0)], with: .top)
// Scroll to top of tableView
UIView.animate(withDuration: 0.3, animations: {
    self.ttableView.scrollToRow(at: IndexPath(row:0, section:0), at: .top, animated: true)
}, completion: { finished in
    if self.ttableView.visibleCells.count > 0 {
    let cell = self.ttableView.visibleCells[0] as! TableViewCell
    cell.textField.becomeFirstResponder()
    cell.textField.placeholder = "input anything ..."
    }
})

}