用UIActivityIndi​​catorView替换UIBarButtonItem不起作用

时间:2010-10-06 02:46:17

标签: iphone uibarbuttonitem uiactivityindicatorview rightbarbuttonitem

当用户按下刷新按钮时,我想用活动指示替换刷新按钮,刷新t​​ableview后,我想将其更改回刷新按钮。但是当我按下刷新按钮时,它没有更改为活动指示器,但刷新按钮会突出显示,直到数据重新加载完成。

代码如下。我错过了什么吗?

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

3 个答案:

答案 0 :(得分:2)

而不是写

[self reloadNewsEnded];

请写下

[NSThread detachNewThreadSelector:@selector(reloadNewsEnded) toTarget:self withObject:nil];

此行在后台启动新线程,因此活动指示符&数据重新加载将在两个线程中同时完成。

答案 1 :(得分:0)

为什么这一行在reloadNewStarted方法的末尾

[self reloadNewsEnded];

它似乎只是撤消对按钮的更改?您应该等到操作完成后才能调用它

答案 2 :(得分:0)

在运行循环重新获得代码控制之前,更改按钮不会生效。听起来你的重载操作是同步的并且阻塞了事件队列,这将不允许这种情况发生。如果您的处理需要相当长的时间,则需要在主运行循环上使用后台线程或异步处理(例如,通过使用NSURLConnection来管理网络任务和回调),这样您就不会阻塞。 p>