UISearchDisplayContoller - 在搜索栏中键入时无法阻止表重新加载

Cli*_*f W 7 iphone uitableview uisearchbar uisearchdisplaycontroller

我正在尝试设置搜索显示控制器来处理来自Web服务的异步结果.我已经掌握了基本功能,但遇到了一个我无法弄清楚的奇怪问题.

似乎是为了安装搜索显示控制器以实现异步,你真的需要做两件事:

  1. 为searchDisplayController返回NO:shouldReloadTableForSearchString,and
  2. 处理searchBarSearchButtonClicked并触发表重装自己.

我正在做这两件事,但我看到的是搜索显示控制器正在重新加载输入到搜索栏中的第一个字符的表,即使我按照#1返回NO.它不会在输入的后续字符上重新加载.

所以,我的问题是:如何在用户输入时让搜索显示控制器不再尝试重新加载表格?(特别是输入的第一个字符)

我已经看到这个问题被提到作为其他几个问题的一部分,但我还没有看到问题的直接答案.在我采用一堆UI修改工作之前,我想了解发生了什么或者我做错了什么.

这是我的代码的快速提炼,以显示问题.当我运行它并在搜索栏中输入"abcde"时,在输入"a"后,结果显示为"#0","a#2"等.在我点击搜索按钮之前,它们不会再次更新然后你会看到"abcde#0","abcde#1"等.当然,在我点击搜索按钮之前,没有任何结果.

#pragma mark -
#pragma mark UISearchDisplayController Delegate Methods

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    return NO;
}

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    return NO;
}


#pragma mark -
#pragma mark UISearchBarDelegate Methods

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    [self.searchDisplayController.searchResultsTableView reloadData];

}


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 20;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    cell.textLabel.text = [self.searchDisplayController.searchBar.text stringByAppendingFormat:@" #%d", indexPath.row]; 
    return cell;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!(顺便说一下,这是我在这里问的第一个问题 - 如果我错过任何礼节点,请告诉我:)

XJo*_*nes 15

这就是UISearchDisplayController(SDC)的工作方式.当用户将第一个字符输入searchBar时,第一次加载并显示searchTable,导致其加载.方法"... shouldReloadTableForSearchString"和"... shouldReloadTableForSearchScope"允许您控制searchTable是否在后续字符或范围更改时自动重新加载.

我已经完成了以下两项工作,以便为第一个角色提供良好的用户体验.轻微的免责声明:我确实有这两种方法都可以实现,但这只是我记忆中实现的框架.我可能错过了一个细节,但这应该让你非常接近.

选项1:在键入第一个字符时,在searchTable中显示"加载"单元格.

此选项允许SDC在用户键入第一个char时显示searchResultsTableView,显示当前搜索/过滤操作的状态

  1. 在SDC委托类定义中

    • 添加iVar BOOL isLoading
    • 添加iVar UITableView *searchTableView
  2. searchDisplayController:didLoadSearchResultsTableView

    • searchTableView = tableView
  3. shouldReloadTableForSearchString/Scope

    • isLoading = YES
    • 调用您的方法在后台加载数据
    • 返回NO
  4. 当您的后台过滤器完成时:

    • isLoading = NO
    • [searchTableView reloadData]
  5. 在各种tableView委托方法中,如果当前搜索结果或结果在后台加载,则响应您希望显示状态的方式.我做的是:

    • 如果有当前搜索结果,则显示结果(即使在后台加载/过滤)
    • 如果没有搜索结果并isLoading == NO返回1行并在单元格中显示"无匹配"
    • 如果没有搜索结果并isLoading == YES返回1行并在单元格中显示搜索活动(我通常使用UIActivityIndi​​catorView)

选项2:隐藏searchTableView并在其中显示叠加视图,直到加载搜索结果

此选项在首次加载时隐藏searchTableView,并且仅在搜索/过滤器完成时重新显示它.我将其定义为选项1的附加内容,因为它们可以一起完成,但如果要隐藏表并显示叠加层,则可以优化您可能不关心在searchResultsTableView中显示搜索活动的内容.

  1. 在SDC委托类定义中

    • 与选项1相同
    • 添加iVar UIView *searchTableOverlayView
  2. searchDisplayController:didLoadSearchResultsTableView

    • 与选项1相同
    • 创建一个UIView作为覆盖来代替searchTableView,其中包含适合您的应用的任何UI并将其设置为 searchTableOverlayView
  3. searchDisplayController:didUnloadSearchResultsTableView

    • 发布 searchTableOverlayView
  4. 在'searchDisplayController中:didShowSearchResultsTableView (may be able to do this insearchDisplayController:willShowSearchResultsTableView`

    • 如果有要显示的搜索结果或 isLoading == NO
      • seachTableOverlayView.hidden == YES
    • 别的(如果isLoading == YES)
      • searchTableOverlayView.frame == searchResultsTableView.frame
      • 添加seachTableOverlayView为子视图searchTableVIew.superview
      • searchTableView.hidden = YES
  5. 当您的后台过滤器完成时

    • 与选项1相同
    • 如果有searchResults显示
      • searchTableCoverView.hidden = YES
      • searchResultsTableView.hidden = NO
    • 其他
      • searchResultsTableView.hidden = YES
      • searchTableCoverView.hidden = NO
  6. 在各种tableView委托方法中,如果当前搜索结果或结果在后台加载,则响应您希望显示状态的方式.我做的是:

    • 与选项1相同