1

当用户按下刷新按钮时,我想用活动指示器替换刷新按钮,并且在刷新 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];  }
4

3 回答 3

2

而不是写

[self reloadNewsEnded];

请写出

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

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

于 2010-10-07T09:48:55.153 回答
0

为什么这条线在reloadNewStarted方法的末尾

[self reloadNewsEnded];

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

于 2010-10-06T03:04:45.390 回答
0

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

于 2010-10-06T03:25:35.060 回答