我正在筛选刚刚开始的新工作的预先存在的代码,而我遇到的第一个错误之一是附加到UITableView
子类的搜索栏,它正在解除每次击键后键盘。经过一番搜索,我找到了this SO question,似乎我找到了答案:应用程序在每次按键后都使用reloadData
刷新结果,重新加载调用resignFirstResponder
并解除键盘。令人沮丧,但解释和理解。
然后我的老板指出我们在应用程序的其他地方使用几乎完全相同的代码,并且它完美地工作。怎么会这样?我发现自己处于一个不寻常的位置,需要解释为什么有效的方法,因为上面的链接表明在reloadData
期间解雇键盘是“正常”的行为。
以下是两个ViewControllers的相关方法,每个ViewControllers都是从同一个自定义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重新加载的人可以帮我一些关于在哪里寻找的线索吗?这似乎是一个相当简单的过程(按下一个键>该方法被称为>它重新加载表>键盘在此过程中被解除)没有太大的空间来改变这种行为,但显然有一种方法可以防止这种情况发生。最后一步,因为搜索视图已经在做了。
知道我应该把注意力集中在哪里找出原因吗?
答案 0 :(得分:2)
检查此方法是否已在此UISearchBar的任一委托上实现。
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar;
如果此方法返回NO,则会阻止搜索栏重新签署第一个响应者。
答案 1 :(得分:2)
所以,答案结果是过于复杂和特定于应用程序,值得详细介绍,但基本上由于一种奇怪的黑客实施方法,有几个与工作相关的自定义对象位于UISearchBar
的第一行(第0行,第0行)的单元格内的UITableView
。
当重新加载UITableView
时,第一行被重新制作,这意味着这些对象被重新制作,从而解除了键盘。当我问我的新老板他们为什么这样做时,他无法记住。
OOF。
答案 2 :(得分:1)
也许尝试继承UISearchBar
并覆盖- (BOOL)resignFirstResponder
。使用您的子类而不是UISearchBar
并在该方法中放置一个断点,您可以看到它的调用位置?