2012-03-02 89 views
1

我有UIBarButtonItem(在接口生成器中配置)。如果用户点击这个按钮,“沉重的过程”将会启动,为了更好的用户体验,我想用(UIActivityIndi​​catorView)来改变这个按钮。我这样做以下列方式:UIBarButtonItem动画消失后

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

你在哪里得到问题?你有什么问题?你的问题不清楚。 – 2012-03-02 13:06:17

回答

0

如果您使用Grand Central Dispatch处理繁重的过程,该怎么办?我会认为它更方便。但请记住,您不能使用该块中的任何UI。这里是一个例子:iphone ios running in separate thread

-1

你应该使用UIToolbar的setItems:animated:方法来替换按钮。

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