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