iOS-活动指示器不会在第一次点击UITableView单元时启动

时间:2013-12-23 10:32:40

标签: ios uitableview uiactivityindicatorview

我是初学者,我实际上正在显示带有单元格的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];
       }
}

2 个答案:

答案 0 :(得分:2)

enter code here Firstable为什么你if为什么?如果你有相同的方法调用集。

然后,如果在方法的开头,则保留可重用性:

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];
        });
    });

}

答案 1 :(得分:0)

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

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

[self.view addSubview:activityIndicator];
[activityIndicator startAnimating];

编辑:一个完整​​的if语句如下所示:

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