我有UIBarButtonItem(在界面构建器中配置)。如果用户单击此按钮,那么"重要过程"将启动并为了更好的用户体验我想用(UIActivityIndicatorView)更改此按钮。我是通过以下方式完成的:
self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
indicator.hidesWhenStopped = YES;
[self.heavyBarButton initWithCustomView:self.indicator];
[self.indicator startAnimating];
[NSThread detachNewThreadSelector:@selector(animateHeavyProcess) toTarget:self withObject:nil];
animateHeavyProcess:
[self heavyProcess];
[self.indicator stopAnimating];
UIBarButtonItem *originalButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"maximize.png"] style:UIBarButtonItemStylePlain target:self action:@selector(startProcessClick:)];
self.heavyBarButton = originalButton;
[originalButton release];
会发生什么:用户单击BarButton动画后将启动并且处理按钮消失后。但是,我希望原始按钮会再次显示。
答案 0 :(得分:0)
如果您使用Grand Central Dispatch进行繁重的过程怎么办?我觉得它更方便。但请记住,您无法使用该块中的任何UI。以下是一个示例:iphone ios running in separate thread
答案 1 :(得分:0)
您不应该在辅助线程中进行UI更新;对UIKit的调用应该在主线程上。
您可以拆分代码的UI更新部分:
- (void)restoreBarButtonItem
{
[self.indicator stopAnimating];
UIBarButtonItem *originalButton = [[UIBarButtonItem alloc]
initWithImage:[UIImage imageNamed:@"maximize.png"]
style:UIBarButtonItemStylePlain
target:self
action:@selector(startProcessClick:)];
self.heavyBarButton = originalButton;
[originalButton release];
}
然后在你繁重的过程中(在辅助线程上运行)只需在主线程上调用这个新的UI更新方法:
- (void)animateHeavyProcess
{
[self heavyProcess];
[self performSelectorOnMainThread:@selector(restoreBarButtonItem:)
withObject:nil
waitUntilDone:NO];
}
答案 2 :(得分:-1)
你应该使用UIToolbar的setItems:animated:方法替换按钮。