iOS-第一次点击UITableView单元格时未启动活动指示器
我是一个初学者,实际上我正在用单元格显示一个tableview,当我们点击tableview单元格时,解析就会发生,在解析过程中,活动指示器会动画显示。但当我尝试这样做时,在第一次点击时,活动指示器不显示,在第一次点击后,当我选择另一个单元格时,它开始工作。为什么会发生这种情况?我正在didSelectRowAtIndexPath中编写代码。这里[self-xmlParsing]是我的解析函数。那么如何解决这个问题呢?请帮忙iOS-第一次点击UITableView单元格时未启动活动指示器,ios,uitableview,uiactivityindicatorview,Ios,Uitableview,Uiactivityindicatorview,我是一个初学者,实际上我正在用单元格显示一个tableview,当我们点击tableview单元格时,解析就会发生,在解析过程中,活动指示器会动画显示。但当我尝试这样做时,在第一次点击时,活动指示器不显示,在第一次点击后,当我选择另一个单元格时,它开始工作。为什么会发生这种情况?我正在didSelectRowAtIndexPath中编写代码。这里[self-xmlParsing]是我的解析函数。那么如何解决这个问题呢?请帮忙 -(void)tableView:(UITableView *)tab
-(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:…您是否尝试了我的建议?好的。同意。但即使我尝试了与您建议的相同的操作,它也不起作用。得到了相同的结果:(