UISearchBar失去焦点

时间:2014-09-25 18:53:23

标签: ios uitableview uisearchbar first-responder

我有一个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];    
}

问题是,在我在搜索栏中键入一个字母后,搜索工作正常,但键盘会立即被解除。我该如何防止这种情况?

4 个答案:

答案 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];