Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UISearchDisplayContoller&x2013;can';t防止在搜索栏中键入时重新加载表_Iphone_Uitableview_Uisearchbar_Uisearchdisplaycontroller - Fatal编程技术网

Iphone UISearchDisplayContoller&x2013;can';t防止在搜索栏中键入时重新加载表

Iphone UISearchDisplayContoller&x2013;can';t防止在搜索栏中键入时重新加载表,iphone,uitableview,uisearchbar,uisearchdisplaycontroller,Iphone,Uitableview,Uisearchbar,Uisearchdisplaycontroller,我正在尝试设置一个搜索显示控制器来处理来自web服务的异步结果。我已经准备好了基本的部分,但是遇到了一个我无法理解的非常奇怪的问题 似乎要为async安装搜索显示控制器,您只需做两件事: 返回否 searchDisplayController:应重新加载搜索字符串的表, 及 手柄searchBarSearchButtonClicked 然后从桌子上开火 我自己 我正在执行这两项操作,但我看到的是,搜索显示控制器在搜索栏中键入的第一个字符上重新加载表,即使我根据#1返回NO。它不会在随后输入的字符

我正在尝试设置一个搜索显示控制器来处理来自web服务的异步结果。我已经准备好了基本的部分,但是遇到了一个我无法理解的非常奇怪的问题

似乎要为async安装搜索显示控制器,您只需做两件事:

  • 返回否 searchDisplayController:应重新加载搜索字符串的表, 及
  • 手柄searchBarSearchButtonClicked 然后从桌子上开火 我自己
  • 我正在执行这两项操作,但我看到的是,搜索显示控制器在搜索栏中键入的第一个字符上重新加载表,即使我根据#1返回NO。它不会在随后输入的字符上重新加载

    因此,我的问题是:如何防止搜索显示控制器在用户键入时尝试重新加载表?(特别是输入的第一个字符)

    我已经看到这个问题作为其他几个问题的一部分被提到,但我还没有看到这个问题的直接答案。在我求助于一堆UI混乱来解决它之前,我想先了解发生了什么或我做错了什么

    下面是对我的代码的一个快速提炼,以说明这个问题。当我运行此程序并在搜索栏中键入“abcde”时,在键入“a”后,结果显示为“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;
    }
    

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

    也许你需要实现
    UISearchDisplayController
    ,然后这个功能:

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

    不幸的是,我相信这正是
    UISearchDisplayController
    的工作原理。如果你想请求不同的功能选项,你应该向苹果提交一份bug报告

    另一种方法是编写您自己的
    UISearchBar
    UITableView
    组合,类似于
    UISearchDisplayController
    的工作方式,这样您可以获得更好的控制


    希望这有帮助

    这正是UISearchDisplayController(SDC)的工作方式。当用户在搜索栏中输入第一个字符时,将首次加载并显示searchTable,从而使其加载。方法“…shouldReloadTableForSearchString”和“…shouldReloadTableForSearchScope”允许您控制是在后续字符上自动重新加载搜索表还是在范围更改时自动重新加载搜索表

    为了在第一个角色上提供良好的用户体验,我已经完成了以下两项工作。免责声明:我确实有这两种方法的实现,但这只是一个从我的记忆中实现的框架。我可能错过了一个细节,但这会让你很接近

    选项1:键入第一个字符时,在搜索表中显示一个“加载”单元格。

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

  • 在SDC委托类定义中

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

    • 设置
      searchTableView=tableView
  • 中,应重新加载搜索字符串/范围的表

    • 设置
      isLoading=YES
    • 调用您的方法在后台加载数据
    • 返回号
  • 完成背景筛选后:

    • 设置
      isLoading=NO
    • [searchTableView重新加载数据]
  • 在各种tableView中,如果有当前搜索结果或结果正在后台加载,委托方法会响应您希望显示状态的方式。我所做的是:

    • 如果存在当前搜索结果,则显示结果(即使在后台加载/筛选)
    • 如果没有搜索结果且
      isLoading==no
      返回1行并在单元格中显示“无匹配项”
    • 如果没有搜索结果且
      isLoading==YES
      返回1行并在单元格中显示搜索活动(我通常使用UIActivityIndicatorView)
  • 选项2:隐藏searchTableView并在其所在位置显示覆盖视图,直到加载搜索结果

    此选项在首次加载searchTableView时隐藏它,并且仅在搜索/筛选完成时才重新显示它。我将其定义为选项1的一个附加项,因为它们可以一起完成,但如果您隐藏表格并显示覆盖,则为了优化内容,您可能不关心在searchResultsTableView中显示搜索活动

  • 在SDC委托类定义中

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

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

    • 发布
      searchTableOverlayView
  • 在“searchDisplayController:didShowSearchResultsTableView
    中(可以在
    searchDisplayController:willShowSearchResultsTableView中执行此操作`

    • 如果要显示搜索结果或
      isLoading==NO
      • seachTableOverlayView.hidden==YES
      • newView.frame = frame;
        [view addSubview:newView];
        
        if (view == currentView)
            return;
        
        view.frame = currentView.frame;
        view.alpha = [self getAlphaValueForView:view];
        
        UIView * superView = [currentView superview];
        [currentView removeFromSuperview];
        
        currentView = view;
        [superView addSubview:currentView];
        
        - (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView;
        {
            tableView.hidden = YES;
        }
        
        self.searchDisplayController.searchResultsTableView.hidden = NO;
        [self.searchDisplayController reloadData]