当TextViewCell在屏幕上不可见时,如何在TableViewCell中成为FirstResponder TextField

时间:2018-01-06 08:51:55

标签: ios swift

使用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

Screenshot when inserted cell is invisible -> error occured

2 个答案:

答案 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。