在执行搜索功能期间如何实现 UIActivityIndi​​catorView?

Posted

技术标签:

【中文标题】在执行搜索功能期间如何实现 UIActivityIndi​​catorView?【英文标题】:How can i implement UIActivityIndicatorView during performing search functionality? 【发布时间】:2014-09-08 19:32:19 【问题描述】:

我正在构建一个文章阅读应用程序。我正在以 JSON 格式从服务器获取数据并加载到 UITableViewController。在用户搜索时 输入一些内容进行搜索,将数据加载到 UITableView 需要时间。我无法在搜索结果加载时间之间实现 UIActivityIndi​​catorView UITableViewController 中的数据。

这是我的代码:

           -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
              
          NSString *searchText=searchBar.text;
         [self.mySearchBar resignFirstResponder];

         NSString *trimmedString = [searchText stringByTrimmingCharactersInSet:
                              [NSCharacterSet whitespaceCharacterSet]];
         if (trimmedString.length==0) 
          isFilter=NO;
            UIAlertView *noConn = [[UIAlertView alloc] initWithTitle:@"ERROR" message:@"Please enter your  something in search bar" delegate:self cancelButtonTitle:nil otherButtonTitles:@"ok", nil];
    [noConn show];
           
         else
           NSString *searchNew = [trimmedString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
                isFilter=YES;
                  @try 
                          [label removeFromSuperview];
                _Title1 = [[NSMutableArray alloc] init];
                _Author1 = [[NSMutableArray alloc] init];
                _Images1 = [[NSMutableArray alloc] init];
                _Details1 = [[NSMutableArray alloc] init];
                _link1 = [[NSMutableArray alloc] init];
                _Date1 = [[NSMutableArray alloc] init];

                              NSString* myURLString = [NSString  stringWithFormat:@“www.example.com&search=%@", searchNew];

                 NSURL *url = [NSURL URLWithString:myURLString];

                 NSData* data = [NSData dataWithContentsOfURL:url];
                if ((unsigned long)data.length > 3) 
                
                 NSArray *ys_avatars = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
                    if(ys_avatars)

                     for (int j=0;j<ys_avatars.count;j++)
                 
                [_Title1 addObject:ys_avatars[j][@"title"]];
                [_Author1 addObject: ys_avatars[j][@"author"]];
                [_Images1 addObject: ys_avatars[j][@"featured_img"]];
                [_Details1 addObject:ys_avatars[j][@"content"]];
                [_link1 addObject:ys_avatars[j][@"permalink"]];
                NSString *newStr=[ys_avatars[j][@"date"] substringToIndex:[ys_avatars[j] [@"date"] length]-3];
                 [_Date1 addObject:newStr];
                   
                      
                else
             
                NSLog(@"error");
                    
              [self.myTableView reloadData];
              
                
               else
                     [self.myTableView reloadData];
                  self.tableView.separatorColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:1.0];
                   label = [[UILabel alloc] initWithFrame:CGRectMake(90, 100, 200, 100)];
                   label.text=@"No Article Found";
                   label.backgroundColor = [UIColor clearColor];
                   [self.view addSubview:label];
                     
                

                 @catch (NSException *exception)    

                              
                  
            

【问题讨论】:

请花点时间缩进代码,这会让你的问题变得混乱 【参考方案1】:

您可以在单击 searchBarSearchButton 后立即执行此操作。 然后在 cellForRowAtIndexPath 中添加这一行:

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar

        [_activityIndicator startAnimating];

your code

下一个:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


     if (indexpath.row == [your_array_of_content count]-1)
     
         [_activityIndicator stopAnimating];
     

【讨论】:

@Bejiibun,我已经应用了这个,但它在表格视图中加载数据后工作。 -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar [spinner startAnimating]; - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath static NSString *Cellidentifier1 = @"searchCell"; ysSearchViewCellTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Cellidentifier1];长行 = [indexPath 行];单元格.TitleLabel1.text = _Title1[行];单元格.AuthorLabel1.text = _Author1[行]; if (indexPath.row == [_Title1 count]-1) [spinner stopAnimating];【参考方案2】:

dataWithContentsOfURL 是一个同步 API。实现您想要的一种方法是使用 NSURLConnection API 从 URL 异步加载日期。您还应该使用下面列出的委托方法来启动和停止活动指示器。

connection:didReceiveResponse:
connectionDidFinishLoading:

我还想建议你使用像 AFNetworking 这样的库,它可以为你提供 before 和 after 钩子作为回调块,这在编码方面会更简洁一些。

【讨论】:

【参考方案3】:

创建指标:

UIActivityIndicatorView *activityIndicator  = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:
                                               UIActivityIndicatorViewStyleWhiteLarge];

[activityIndicator setCenter:CGPointMake(view.frame.size.width/2.0, view.frame.size.height/2.0)];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.color = [UIColor blackColor];

//add it to the view
[self.view addSubview:activityIndicator];
//start the animation
[activityIndicator startAnimating];

当你想关闭它时:

[activityIndicator stopAnimating];

【讨论】:

以上是关于在执行搜索功能期间如何实现 UIActivityIndi​​catorView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在WindowClosing事件期间更新JFrame对象?

网络通信模型

如何在页面加载时执行 AngularJS 控制器功能?

如何在搜索/过滤数据期间处理空字段?

EXCEL VBA 窗体设计,如何实现查询前一条记录和后一条记录的功能。

Java如何实现多选项搜索功能(查询数据库)?