使用Xcode ver 9.2,Swift开发iOS应用程序。
点击RightNavigationButtonAdd之后,我想在TableView的开头插入一个TableViewCell,并将其中的TextField作为焦点(becomeFirstResponder)。
当插入的TableViewCell可见时,它可以正常工作。但是,当插入的TableViewCell不可见时,由于cellForRow返回nil而发生错误。
你可以告诉我怎么样?RightNavigationButtonAdd操作代码
@objc func RightNavigationButtonAdd(_ sender: UIBarButtonItem) {
// array is ["aaa", "bbb", "ccc", "ddd", ...]
array.insert("", at: 0)
// ttableView is @IBOutlet var ttableView: UITableView!
// it is set to "No selection during editing"
ttableView.insertRows(at: [IndexPath(row:0, section:0)], with: .top)
// when inserted cell is invisible, error occured:
// "Fatal error: Unexpectedly found nil while unwrapping an Optional value"
let cell = ttableView.cellForRow(at: IndexPath(row:0, section:0)) as! TableViewCell
cell.textField.becomeFirstResponder()
cell.textField.placeholder = "input anything ..."
ttableView.scrollToRow(at: IndexPath(row:0, section:0), at: .top, animated: true)
}
Screenshot when inserted cell is visible -> it works normally
答案 0 :(得分:1)
你的代码几乎没问题,但你崩溃了,因为那个单元格超出范围,所以首先你必须滚动到开头(让它可见),然后你就可以得到这样的单元格{{ 1}}。您可以查看cellForRow的文档:
表示表格单元格的对象,如果单元格不可见或indexPath超出范围,则为nil。
这里是解决方案:
IndexPath(row:0, section:0)
答案 1 :(得分:0)
正如Andrea Mugnaini's answer指出的那样,您需要滚动到该单元格,使其成为public void onPartitionsAssigned(Collection<TopicPartition> partitions) {
kafkaConsumer.seekToEnd(partitions);
}
到textField
。现在回答你的问题
[...] cellForRow返回nil。你能告诉我怎么样吗?
TableView有一个单元池,可在您调用becomeFirstResponder()
时重复使用。因此,当单元格不再可见时,它会返回池并稍后由cellForRow(at:)
返回。这是因为无论您需要在应用中显示多少个单元格,实际上只需要适合您屏幕的单元格数量。你只需重用它们。这种方法的问题在于即使你想要返回tableView的可见部分之外的单元格,也不能这样做,因为当前没有单元格显示该行(它们都忙着显示你现在看到的行) ,因此cellForRow(at:)
返回nil。