iOS-第一次点击UITableView单元格时未启动活动指示器

iOS-第一次点击UITableView单元格时未启动活动指示器,ios,uitableview,uiactivityindicatorview,Ios,Uitableview,Uiactivityindicatorview,我是一个初学者,实际上我正在用单元格显示一个tableview,当我们点击tableview单元格时,解析就会发生,在解析过程中,活动指示器会动画显示。但当我尝试这样做时,在第一次点击时,活动指示器不显示,在第一次点击后,当我选择另一个单元格时,它开始工作。为什么会发生这种情况?我正在didSelectRowAtIndexPath中编写代码。这里[self-xmlParsing]是我的解析函数。那么如何解决这个问题呢?请帮忙 -(void)tableView:(UITableView *)tab

我是一个初学者,实际上我正在用单元格显示一个tableview,当我们点击tableview单元格时,解析就会发生,在解析过程中,活动指示器会动画显示。但当我尝试这样做时,在第一次点击时,活动指示器不显示,在第一次点击后,当我选择另一个单元格时,它开始工作。为什么会发生这种情况?我正在didSelectRowAtIndexPath中编写代码。这里[self-xmlParsing]是我的解析函数。那么如何解决这个问题呢?请帮忙

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell= [tableView cellForRowAtIndexPath:indexPath];

    if(cell.accessoryView==nil)
  if (indexPath.row==0)
        {
            [parseArray removeAllObjects];
            [self.view addSubview:activityIndicator];
            [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
            [self xmlParsing];
            [activityIndicator stopAnimating];
       }
   if (indexPath.row==1)
        {
            [parseArray removeAllObjects];
            [self.view addSubview:activityIndicator];
            [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
            [self xmlParsing];
            [activityIndicator stopAnimating];
       }
   if (indexPath.row==2)
        {
            [parseArray removeAllObjects];
            [self.view addSubview:activityIndicator];
            [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
            [self xmlParsing];
            [activityIndicator stopAnimating];
       }
}

在此处输入代码
第一个表格为什么
如果
一切?在每种情况下,如果您具有相同的方法调用集

如果在方法开始时:

if(cell.accessoryView==nil)
我想这是个错误

最后,在其他线程上启动动画,但不能这样做-始终调用主线程进行动画:

因此,您的方法应该如下所示:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
            [parseArray removeAllObjects];
            [self.view addSubview:activityIndicator];

           // [NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil]; // this line have to be rewrite. I write solution below.
            [self xmlParsing];
            [activityIndicator stopAnimating];
       }
}
现在让我们关注线程安全动画。“正常”调用您的方法,如
[self-threadStartAnimating:self]在上述方法中。然后将其修改为:

-(IBAction) threadStartAnimating:(id)object {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //do all your task here (task, witch not included pushing or taking something from/to the screen).
        dispatch_async(dispatch_get_main_queue(), ^{
            //here is the place to redraw the screen like [self.view addSubview:mySub];
        });
    });

}

苹果明确禁止开发者在后台线程上更新用户界面元素。每个应用程序都有一个主UI线程,所有UI更新都必须在该线程上执行。我怀疑您没有在主线程上设置活动指示器的动画

您在哪里呼叫
[activityIndicator startAnimating]
?如果您在
threadStartAnimating:
(您正在后台线程上运行)中调用它,那么这很可能就是问题所在。相反,请在将其添加到视图后直接尝试设置动画,如下所示:

[self.view addSubview:activityIndicator];
[activityIndicator startAnimating];
  if (indexPath.row==0)
    {
        [parseArray removeAllObjects];
        [self.view addSubview:activityIndicator];
        [activityIndicator startAnimating];
        [self xmlParsing];
        [activityIndicator stopAnimating];
   }
编辑:一个完整的if语句如下所示:

[self.view addSubview:activityIndicator];
[activityIndicator startAnimating];
  if (indexPath.row==0)
    {
        [parseArray removeAllObjects];
        [self.view addSubview:activityIndicator];
        [activityIndicator startAnimating];
        [self xmlParsing];
        [activityIndicator stopAnimating];
   }

threadStartAnimating:是一个包含[activityIndicator startAnimating]的函数;像这样-(void)threadStartAnimating:(id)data{[activityIndicator startAnimating];}好的,那么你明白为什么这不起作用了吗?您正在尝试在后台线程上设置ActivityInIndicator的动画,因为您正在执行[NSThread detachNewThreadSelector:@selector(ThreadStartImating:…您是否尝试了我的建议?好的。同意。但即使我尝试了与您建议的相同的操作,它也不起作用。得到了相同的结果:(