UISearchBar textDidChange creating error: There are visible views left after reusing them all: { (null) = (null); }

UISearchBar textDidChange creating error: There are visible views left after reusing them all: { (null) = (null); }

我正在使用带有 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 结束之前。正如我在标题中提到的,警告是这样的:

There are visible views left after reusing them all: { (null) = (null); }

有谁知道为什么会这样,如何解决?

我在使用自定义 UITextField 的部分 header 视图中遇到了类似的问题。我通过在重新加载 table 视图数据之前在文本字段上调用 ​​resignFirstResponder 并在重新加载操作之后调用 becomeFirstResponder 来消除警告。类似于:

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

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

在我的例子中,我发现只有当我将 UISearchBar 设置为 TableView 的部分 header 时才会记录 There are visible views left after reusing them all: { (null) = (null); } 错误。我这样做是为了让搜索栏浮动在 UITableViewController 的顶部。

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