UISearchBar 失去焦点
Posted
技术标签:
【中文标题】UISearchBar 失去焦点【英文标题】:UISearchBar losing focus 【发布时间】:2014-09-25 18:53:22 【问题描述】:我有一个用于 UITableView 的 UISearchBar,我的实现如下:
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
[self.searchBar becomeFirstResponder];
if(searchText.length == 0)
self.isFiltered = NO;
else
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.writer1 contains[c] %@", searchText];
self.isFiltered = YES;
[[RTRepairOrderStore sharedStore] filterROArray:predicate];
[self.tableView reloadData];
问题是,在我在搜索栏中输入一个字母后,搜索有效,但键盘立即关闭。我怎样才能防止这种情况发生?
【问题讨论】:
这里是这个问题的正确答案:***.com/a/25796944/4833705 【参考方案1】:searchBar 失去焦点,因为它可能位于 tableView 标题中,并且正在重新加载 tableView。
您可以通过以下任一方式防止这种情况:
移动 searchBar,使其不再是 tableView 的子视图。选项包括将 searchBar 放置在导航栏或 tableView 上方的视图中。
将reloadData
替换为以下方法之一以避免重新加载tableView 标头:
使用reloadSections:withRowAnimation:
重新加载表格的一部分,或者
使用 beginUpdates
endUpdates
为要插入或删除的特定行的更改设置动画。
【讨论】:
【参考方案2】:对我有用的是在 reloadData 之后进行 becomeFirstResponder 调用:
[self.tableView reloadData];
[self.searchBar becomeFirstResponder];
这适用于 ios 8.1.2,我还没有在其他版本上测试过。
【讨论】:
【参考方案3】:我在上面遇到了同样的问题,但原因不同。我的UISearchBar
在表格顶部的一个单元格中。键入时,我会调用以重新加载 UITableView
,这导致搜索栏失去焦点 - 因为包含搜索栏的单元格正在重新加载。
解决方案是只重新加载我需要的单元格。我的搜索栏在第 0 部分,所有搜索结果在第 1 部分。所以这样的调用确保只有第 1 部分被重新加载,并且搜索栏没有失去焦点。
NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1];
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic];
【讨论】:
【参考方案4】:当searchBar:textDidChange:
被调用时,searchBar
是 FirstResponder
。无需向其发送becomeFirstResponder
消息。
此外,您确实将becomeFirstResponder
发送到self.searchBar
,这可能与在searchBar:textDidChange:
方法调用期间传输给您的searchBar
不同。
我建议删除[self.searchBar becomeFirstResponder];
并检查您的属性self.searchBar
是否真的链接到回调searchBar:textDidChange:
中的searchBar
对象。
【讨论】:
以上是关于UISearchBar 失去焦点的主要内容,如果未能解决你的问题,请参考以下文章