我有一个UITearchBar用于UITableView,我的实现如下:
-(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];
}
问题是,在我在搜索栏中键入一个字母后,搜索工作正常,但键盘会立即被解除。我该如何防止这种情况?
答案 0 :(得分:5)
searchBar正在失去焦点,因为它可能位于tableView标头中,并且正在重新加载tableView。
您可以通过以下方式阻止:
移动searchBar,使其不再是tableView的子视图。选项包括将searchBar放在导航栏中,或放在tableView上方的视图中。
使用以下方法之一替换reloadData
以避免重新加载tableView标头:
使用reloadSections:withRowAnimation:
重新加载表格的一部分,或
使用beginUpdates
endUpdates
为要插入或删除的特定行的更改设置动画。
答案 1 :(得分:2)
对我来说有用的是在reloadData之后调用becomeFirstResponder:
[self.tableView reloadData];
[self.searchBar becomeFirstResponder];
这适用于iOS 8.1.2,我还没有在其他版本上测试它。
答案 2 :(得分:0)
调用searchBar:textDidChange:
时,searchBar
是FirstResponder
。无需向其发送becomeFirstResponder
消息
此外,您确实将becomeFirstResponder
发送至self.searchBar
,这可能与searchBar
方法调用期间转移给您的searchBar:textDidChange:
不同。
我建议您删除[self.searchBar becomeFirstResponder];
并检查您的媒体资源self.searchBar
是否真的与回调searchBar
中的searchBar:textDidChange:
对象相关联。
答案 3 :(得分:0)
我遇到了上面遇到的相同问题,但原因不同。我的UISearchBar
位于表格顶部的单元格内。键入时,我会调用重新加载UITableView
,这会导致搜索栏失去焦点 - 因为包含搜索栏的单元格正在重新加载。
解决方案是仅重新加载我需要的细胞。我的搜索栏位于第0部分,所有搜索结果都在第1部分。所以这样的调用确保只重新加载第1部分,并且搜索栏没有失去焦点。
NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1];
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic];