在 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
时,我需要能够检索用户键入的内容。为了更新正确的数据集,我目前的做法是检索UITextField
的indexPath
我的问题是:当我慢慢滚动并一一点击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】:我不确定您是否使用正确的方法来获取indexPath
的UITextField
,这可能会导致崩溃。但是您可以尝试在您的cellForRowAtIndexPath
中进行类似的操作,您可以将UITextField
的标签设置为indexPath.row
,然后使用-
let cell = PointSourcesTV.cellForRowAtIndexPath(IndexPath(row: textField.tag, section: 0)) as! UITableViewCell
【讨论】:
谢谢瑞克。这是我最初想采用的方法,但由于我有不同数量的部分,我不确定如何将此信息传递到textFieldDidEndEditing
。我需要textFieldDidEndEditing
中indexPath.row
和indexPath.section
的信息,以便正确编辑我的数据集。我在响应中看到这里的section
设置为 0。有没有另一种方法可以可变地传递这些信息?
好吧,如果它是客观的 - 我可以告诉你继承你的 UITextField
并传递两个属性!但是我在 swift 中的效率不够高,无法告诉您子类化是如何工作的并在 swift 中为它键入代码:)!
我没想过要做subclass
。多伊!稍后我会试一试,如果它解决了我的问题,请告诉您。我仍然很想知道为什么我上面的代码只在UITextFields
出现在屏幕上时才有效
这可能是因为当您快速滚动并按下文本字段时,由于重复使用单元格,在您点击它时可能无法正确设置单元格。当然我只是吐口水,也许其他人可以给出背后的原因:D以上是关于在 UITableView 中快速滚动并选择单元格时,文本字段委托将 indexPath 返回为 nil 并崩溃的主要内容,如果未能解决你的问题,请参考以下文章