对于这种边缘情况,如何检测何时从 iOS 的 uitableview 中删除单元格?
Posted
技术标签:
【中文标题】对于这种边缘情况,如何检测何时从 iOS 的 uitableview 中删除单元格?【英文标题】:How detect when a cell is removed from a uitableview in iOS for this edge case? 【发布时间】:2015-09-19 22:10:09 【问题描述】:我可以通过为 tableView:didEndDisplayingCell:forRowAtIndexPath: 方法编写处理程序来检测何时从 UITableView 中删除单元格。每当从显示中删除单元格时,都会调用此方法。但是,有一个例外。
当单元格有一个 UITextField 并且该字段是第一响应者时,即使它从显示屏上滚出并且它之前和之后的单元格都滚出,也永远不会调用此方法。
该单元格也被确认从 UITableView 中删除,同时单元格被滚动出屏幕。在这种情况下,对 cellForRowAtIndexPath: 的调用返回 nil。
我还继承了 UITableViewCell 并为 removeFromSuperView 编写了一个处理程序。当滚动离开屏幕时,再次为所有单元格调用此方法,除非单元格具有 UITextField 并且它是第一响应者。
另外需要注意的是,单元格中的 UITextField 在滚动离开屏幕时接受键输入,并且对 cellForRowAtIndexPath: 的调用返回 nil。当单元格滚动回视图时,我可以看到这一点。
有没有人有任何解决方案来检测单元格何时滚动到视图之外,以便控制器可以访问 UITextField?
【问题讨论】:
【参考方案1】:您可以尝试在单元格消失之前手动让您的第一响应者辞职。根据您的要求,这可以通过多种方式完成,通常是在用户开始滚动时。如果单元格仍然可见,您可以在他完成滚动后恢复第一响应者。从图形设计的角度来看也可能更好。
或者,您可以尝试实现委托的 tableView:willDisplayCell:forRowAtIndexPath:
并设置以前的可见单元格,您将与 tableview 的 visibleCells 数组相交。不在当前 visibleCells 中但在前一个中的元素已被删除。然后将一个 copy 的 visibleCells 分配给 previousVisibleCells。
这可能是 Apple 代码中的错误,您可以为它提交一个雷达。
【讨论】:
感谢您抽出宝贵时间回复。我一直在为此苦苦挣扎,因为我觉得应该有一个简单的解决方案。您的回复让我再次思考 UIScollView 类和委托。在查看这些方法时,我注意到了 keyboardDismissMode 属性。其中一个值是 UIScrollViewKeyboardDismissModeOnDrag。我回到 UIBuilder 并设置表格视图的值以在拖动时关闭键盘。瞧,这迫使 UITextField 在没有任何代码的情况下辞职第一响应者。这是我需要的完美解决方案。完美!!! 太棒了。不知道那个。感谢分享。以上是关于对于这种边缘情况,如何检测何时从 iOS 的 uitableview 中删除单元格?的主要内容,如果未能解决你的问题,请参考以下文章
[iOS]:检测从另一个外部应用程序返回后视图控制器何时出现
iOS - 拖放碰撞检测如何检测您选择的项目何时拖过另一个子视图?