2014-09-25 117 views
2

我有一个UITableView一个UISearchBar和我的实现如下:的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];  
} 

的问题是,当我键入一个字母在搜索栏中,搜索工作,但键盘被立即解雇。我怎样才能防止这一点?

回答

0

When searchBar:textDidChange: called,searchBaris the FirstResponder。没有必要发送一个becomeFirstResponder消息。
此外,您确实发送了becomeFirstResponderself.searchBar,这可能与在searchBar:textDidChange:方法调用期间转移给您的searchBar不同。
我建议删除[self.searchBar becomeFirstResponder];并检查您的财产self.searchBar是否真的与回调searchBar:textDidChange:中的searchBar对象相关联。

4

searchBar失去焦点,因为它可能位于tableView标题中,并且tableView正在重新加载。

您可以通过防止这种情况:

  • 移动搜索栏所以它不再的tableView的子视图。选项包括将searchBar放置在导航栏中,或放置在tableView上方的视图中。

  • 用下列方法之一更换reloadData以避免重新加载的tableView头:

    • 使用reloadSections:withRowAnimation:重新加载表的部分,或

    • 使用beginUpdatesendUpdates动画更改要插入或删除的特定行。

2

什么工作对我来说是让becomeFirstResponder呼叫reloadData一个后发生:

[self.tableView reloadData]; 
[self.searchBar becomeFirstResponder]; 

这是工作在iOS 8.1.2,我没有对测试其他版本呢。

0

我遇到了上面遇到的相同问题,但是原因不同。我的UISearchBar位于表格顶部的一个单元内。打字时,我会打电话重新加载UITableView,这导致搜索栏失去焦点 - 因为包含搜索栏的单元格是正在重新加载的单元格。

解决方案是只重新加载我需要的细胞。我的搜索栏位于第0部分,所有搜索结果位于第1部分。因此,像这样的调用确保只有第1部分被重新加载,并且搜索栏没有失去焦点。

NSIndexSet *section1 = [NSIndexSet indexSetWithIndex:1]; 
[self.tableView reloadSections:section1 withRowAnimation:UITableViewRowAnimationAutomatic];