在 UITableView 中快速滚动并选择单元格时,文本字段委托将 indexPath 返回为 nil 并崩溃

Posted

技术标签:

【中文标题】在 UITableView 中快速滚动并选择单元格时,文本字段委托将 indexPath 返回为 nil 并崩溃【英文标题】:When scrolling fast in UITableView and selecting cell, textfield delegate returns indexPath as nil and crashes 【发布时间】:2016-11-16 03:16:00 【问题描述】:

我的TableViewController 的结构是这样的(出于授权目的提及):

----View
-----Scroll View
------Content View
-------TableView
--------TableViewCell

我可以正确加载TableView 的所有行和部分。每个TableViewCell 都有一个可编辑的UITextField。当用户开始编辑UITextField 时,我需要能够检索用户键入的内容。为了更新正确的数据集,我目前的做法是检索UITextFieldindexPath

我的问题是:当我慢慢滚动并一一点击UITextField时,我不会崩溃。但是,如果我单击一个单元格并快速向下滚动(即使我留在同一个section),我也会因为indexPath 为空而崩溃。

在我的委托中,我有这个:

func textFieldDidEndEditing(_ textField: UITextField) 
    //here is the code I am using to determine the indexPath
    let view = textField.superview!
    let cell = view.superview as! UITableViewCell
    let viewController = ShowPointsViewController() //this is the name of my ViewController
    let textFieldIndexPath = PointSourcesTV.indexPath(for: cell) //this is the name of my TableView

    print(textFieldIndexPath) //Returns nil here if I scroll too quickly
    let key = tableHeaders[(textFieldIndexPath?.section)!]

【问题讨论】:

你在委托方法中得到单元格了吗? 【参考方案1】:

我不确定您是否使用正确的方法来获取indexPathUITextField,这可能会导致崩溃。但是您可以尝试在您的cellForRowAtIndexPath 中进行类似的操作,您可以将UITextField 的标签设置为indexPath.row,然后使用-

let cell = PointSourcesTV.cellForRowAtIndexPath(IndexPath(row: textField.tag, section: 0)) as! UITableViewCell

【讨论】:

谢谢瑞克。这是我最初想采用的方法,但由于我有不同数量的部分,我不确定如何将此信息传递到textFieldDidEndEditing。我需要textFieldDidEndEditingindexPath.rowindexPath.section 的信息,以便正确编辑我的数据集。我在响应中看到这里的section 设置为 0。有没有另一种方法可以可变地传递这些信息? 好吧,如果它是客观的 - 我可以告诉你继承你的 UITextField 并传递两个属性!但是我在 swift 中的效率不够高,无法告诉您子类化是如何工作的并在 swift 中为它键入代码:)! 我没想过要做subclass。多伊!稍后我会试一试,如果它解决了我的问题,请告诉您。我仍然很想知道为什么我上面的代码只在UITextFields 出现在屏幕上时才有效 这可能是因为当您快速滚动并按下文本字段时,由于重复使用单元格,在您点击它时可能无法正确设置单元格。当然我只是吐口水,也许其他人可以给出背后的原因:D

以上是关于在 UITableView 中快速滚动并选择单元格时,文本字段委托将 indexPath 返回为 nil 并崩溃的主要内容,如果未能解决你的问题,请参考以下文章

使用内联选择器的 UITableView 滚动性能

滚动会弄乱 UITableView 中的自定义单元格

UITableViewCell 选择停留在所有单元格中!

将 UITableView 单元格滚动到表格边界之外

滚动并返回到 UITableView 中的部分关闭(包含 0 个单元格)

在某些单元格上禁用UITableView滚动