当用户按下刷新按钮时,我想用活动指示替换刷新按钮,刷新tableview后,我想将其更改回刷新按钮。但是当我按下刷新按钮时,它没有更改为活动指示器,但刷新按钮会突出显示,直到数据重新加载完成。
代码如下。我错过了什么吗?
-(void) reloadNewsStarted{
UIActivityIndicatorView *activityIndicatorRightBarItem = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
[activityIndicatorRightBarItem startAnimating];
UIBarButtonItem *activityItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorRightBarItem];
[activityIndicatorRightBarItem release];
self.navigationItem.rightBarButtonItem = activityItem;
[activityItem release];
[self reloadNewsEnded];
}
-(void) reloadNewsEnded {
//reload data process
UIBarButtonItem *reloadNewsBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(reloadNewsStarted)];
reloadNewsBtn.style = UIBarButtonItemStyleBordered;
self.navigationItem.rightBarButtonItem = reloadNewsBtn;
[reloadNewsBtn release]; }
答案 0 :(得分:2)
而不是写
[self reloadNewsEnded];
请写下
[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil];
此行在后台启动新线程,因此活动指示符&数据重新加载将在两个线程中同时完成。
答案 1 :(得分:0)
为什么这一行在reloadNewStarted
方法的末尾
[self reloadNewsEnded];
它似乎只是撤消对按钮的更改?您应该等到操作完成后才能调用它
答案 2 :(得分:0)
在运行循环重新获得代码控制之前,更改按钮不会生效。听起来你的重载操作是同步的并且阻塞了事件队列,这将不允许这种情况发生。如果您的处理需要相当长的时间,则需要在主运行循环上使用后台线程或异步处理(例如,通过使用NSURLConnection来管理网络任务和回调),这样您就不会阻塞。 p>