使用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 ..."
})
}
答案 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 ..."
}
})
}