我有一个UITableview,顶部有一个导航栏。我有一个刷新按钮作为rightBarButtonItem。
单击刷新按钮时,我想隐藏刷新按钮,重新加载表格并显示警报视图。
-(void)refreshClicked{
self.navigationItem.rightBarButtonItem=nil;
app.networkActivityIndicatorVisible = YES;
[appDelegate readJSONData];
[self.tableView reloadData];
UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[infoAlert show];
[infoAlert release];
}
我发现当我的wifi信号变弱时,刷新按钮不会立即隐藏,并且会有延迟。我担心如果使用3G会有进一步的延迟,用户可能会再次按下刷新按钮,这是第一次没有按下。
我的代码有问题吗?
帮助将不胜感激
编辑-----------
-(void)refreshClicked{
self.navigationItem.rightBarButtonItem=nil;
app.networkActivityIndicatorVisible = YES;
// do data processing in the background
[self performSelectorInBackground:@selector(doBackgroundProcessing) withObject:self];
UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[infoAlert show];
[infoAlert release];
}
- (void)doBackgroundProcessing {
NSAutoreleasePool*pool=[[NSAutoreleasePool alloc] init];
[appDelegate readJSONData];
// must update the UI from the main thread only; equivalent to [self.tableView reloadData];
[self performSelectorOnMainThread:@selector(reloadData) withObject:self.tableView waitUntilDone:NO];
[pool release];
}
错误
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[campaignTableViewController reloadData]: unrecognized selector sent to instance 0x703eba0'
答案 0 :(得分:0)
基本上,虽然你没有rightBarButtonItem
,但是在控件返回到应用程序的主运行循环之前,该更改不会反映在UI中。因此,如果您的方法的其余部分需要一些明显的时间(就像网络请求一样),那么在完成该工作之后,您将看不到按钮消失。
更直接:你正在阻止主线程;要修复它,你需要在后台线程上进行耗时的工作。
这样的事情应该有效(既不编译也不测试):
-(void)refreshClicked{
self.navigationItem.rightBarButtonItem=nil;
app.networkActivityIndicatorVisible = YES;
// do data processing in the background
[self performSelectorInBackground:@selector(doBackgroundProcessing) withObject:self];
// go ahead and show the alert immediately
UIAlertView *infoAlert = [[UIAlertView alloc] initWithTitle:@"" message:@"Kampanjerna är nu uppdaterade" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
[infoAlert show];
[infoAlert release];
}
- (void)doBackgroundProcessing {
[appDelegate readJSONData];
// must update the UI from the main thread only; equivalent to [self.tableView reloadData];
[self performSelectorOnMainThread:@selector(reloadData) withObject:self.tableView waitUntilDone:NO];
}
答案 1 :(得分:0)
为什么不禁用刷新按钮,它更容易,个人就是我认为用户期望的。它是众多软件应用程序中使用的范例。如果我触摸一个按钮,我真的希望它消失,它为什么会消失,它是否已经破碎?如果它被禁用并且用户可以看到正在发生的事情(活动指示器,警报框 - 可能是过度杀伤?)那么他们会更加确信您的应用程序以可预测和可靠的方式运行
myButton.isEnabled = NO;
//在你做的时候设置活动指标
//完成后
myButton.isEnabled = YES;