【问题标题】:UITableView dismisses keyboard on reloadData in one place, but not in another?UITableView 在一个地方关闭 reloadData 上的键盘,但在另一个地方没有?
【发布时间】:2014-10-14 00:19:00
【问题描述】:

我正在从我刚开始的新工作中筛选预先存在的代码,我遇到的第一个错误是附加到 UITableView 子类的搜索栏,它在之后关闭键盘每一次击键。经过一番搜索,我找到了this SO question,似乎我找到了答案:应用程序在每次击键后使用reloadData 刷新结果,并且重新加载调用resignFirstResponder 并关闭键盘。令人沮丧,但解释和理解。

但后来我的老板指出,我们在应用程序的其他地方使用几乎完全相同的代码,而且效果很好。怎么可能?我发现自己处于一个不寻常的位置,需要解释为什么某些东西会起作用,因为上面的链接表明在reloadData 期间关闭键盘是“正常”行为。

以下是来自两个 ViewController 的相关方法,每个 ViewController 都是同一个自定义 UITableView 的子类。 (方法已被简化,但不同的行为仍然存在。)我的一部分认为它一定是埋藏在两个子类之间的差异中,但是如果reloadData 是问题并且它没有在任何地方被覆盖,这是否意味着子类无关紧要?

查找视图:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self.tableView reloadData];
    NSLog(@"Lookup Reloaded");
}

搜索视图:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    [self.tableView reloadData];
    NSLog(@"Search Reloaded");
}

如您所见,它们是相同的。每次击键后都会成功调用两者,但前者会关闭键盘,而后者不会。

这些视图控制器中的每一个都有超过一千行长,所以我很难缩小可能导致不同行为的原因。了解 FirstResponders 和 TableView reloads 的人可以帮助我了解在哪里寻找的线索吗?这似乎是一个相当简单的过程(按下一个键>调用该方法>它重新加载表格>键盘在该过程中被关闭)没有太多空间来改变这种行为,但显然有一种方法可以防止最后一步,因为搜索视图已经在这样做了。

知道我应该将搜索重点放在哪里以找出原因吗?

【问题讨论】:

  • 在其他键盘不关闭的情况下,您的表格是否会重新加载?

标签: ios uitableview


【解决方案1】:

检查此方法是否已在此 UISearchBar 的任一委托上实现。

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar;

如果该方法返回NO,将阻止搜索栏退出第一响应者。

【讨论】:

    【解决方案2】:

    也许可以尝试继承 UISearchBar 并覆盖 - (BOOL)resignFirstResponder。使用您的子类而不是 UISearchBar 并在该方法中放置一个断点,您可以看到它是从哪里调用的?

    【讨论】:

    • 我会试一试,但这能解释为什么它在一个地方工作而不在另一个地方工作吗?我无法摆脱答案就在我面前的感觉,我就是无法将手指放在它上面。
    • 如果你在这两个地方都使用子类,然后比较堆栈跟踪,希望它会变得明显 - 不幸的是我自己没有看到这种情况发生
    • 这不是答案,但我最终在调查这个问题时找到了答案。所以在这里,有一个赏金! :D 我已经添加了最终原因作为我自己的答案,以防其他人遇到像这样奇怪的情况。
    【解决方案3】:

    因此,结果证明答案过于复杂且特定于应用程序,不值得详细介绍,但基本上由于实现方法的怪异和 hack-y,有几个自定义对象与UISearchBar 位于UITableView 的第一行(第 0 行,第 0 行)的单元格内。

    UITableView 被重新加载时,第一行被重新制作,这意味着这些对象被重新制作,从而关闭了键盘。当我问我的新老板他们为什么这样做时,他不记得了。

    哎呀。

    【讨论】:

    • 作为一个想法,我们可以尝试重新加载 UITableView 部分,该部分不会包含 UITextField / UISearchBar 对象而不是整个单元格
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2023-04-01
    • 2013-02-23
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    相关资源
    最近更新 更多