Ios UISearchBar textDidChange创建错误:重用所有视图后仍有可见视图:{(null)=(null);}

Ios UISearchBar textDidChange创建错误:重用所有视图后仍有可见视图:{(null)=(null);},ios,warnings,uisearchbar,Ios,Warnings,Uisearchbar,我正在使用带UISearchBar的UITableViewController。一切似乎都很正常,除了我在textDidChange方法中收到一个奇怪的警告,这是我以前从未见过的 这是我的代码: - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { [self.searchResults removeAllObjects]; if([searchText isEqual

我正在使用带UISearchBar的UITableViewController。一切似乎都很正常,除了我在
textDidChange
方法中收到一个奇怪的警告,这是我以前从未见过的

这是我的代码:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {

    [self.searchResults removeAllObjects];
    if([searchText isEqualToString:@""]||searchText==nil){
        [self.tableView reloadData];
        return;
    }

    for(NSArray *monsterArray in self.monsterArray) {
        NSString *name = monsterArray[0];
        NSRange r = [[name lowercaseString] rangeOfString:[searchText lowercaseString]];
        if(r.location != NSNotFound) {
            if(r.location==0) {
                [self.searchResults addObject:monsterArray];
            }
        }
    }

    [self.tableView reloadData];
}
通过单步执行该程序,我发现警告出现在
textDidChange
结尾之前。正如我在标题中提到的,警告如下:

重复使用所有视图后,仍有可见视图:{ (空)=(空); }


有人知道为什么会发生这种情况,以及如何解决它吗?

我在自定义
UITextField的节标题视图中遇到了类似的问题。我在重新加载表视图数据之前调用文本字段上的
resignFirstResponder
,在重新加载操作之后调用
becomeFirstResponder
,从而消除了警告。比如:

// Workaround: hide and show keyboard to prevent warning when reloading results
[self.searchTextField resignFirstResponder];
[self.tableView reloadData];
[self.searchTextField becomeFirstResponder];

虽然另一个答案确实消除了放在控制台中的错误,但它也产生了一些意想不到的后果。主要是调用resignFirstResponder,然后像这样成为FirstResponder,重置键盘的状态。因此,如果您键入字母,键盘将从数字重置为字母。如果您试图键入一串字母,这会变得很烦人

在我的例子中,我发现
在重用了所有视图之后,仍然有可见的视图:{(null)=(null);}
错误只有在我将UISearchBar设置为TableView的节标题时才被记录。我这样做是为了让搜索栏浮动在UITableViewController的顶部


相反,我进行了重构以使用UIViewController,将UISearchBar放在顶部,将UITableView放在下面,这似乎已经正确地解决了问题。

我在一个类似的文本字段委托方法中遇到了同样的问题:
func textField(textField:UITextField,shouldChangeCharactersRange范围:NSRange,replacementString:string)->Bool
。由于互联网上没有这方面的信息,这个xkcd委员会准确地描述了我的感受:这值得更多的投票,这已经困扰了我好几个星期了,直到现在,我所能找到的都是人们说你对此无能为力!对我来说,添加这些会让键盘隐藏起来,不再出现。就像becomeFi一样rstResponder根本不会被触发…:/相同的解决方案在我的案例中有所帮助。调用
辞职FirstResponder
重新加载数据
成为FirstResponder
的顺序的想法似乎太老套了。