动画后的UIBarButtonItem消失

时间:2012-03-02 12:59:34

标签: objective-c ios uibarbuttonitem uiactivityindicatorview

我有UIBarButtonItem(在界面构建器中配置)。如果用户单击此按钮,那么"重要过程"将启动并为了更好的用户体验我想用(UIActivityIndi​​catorView)更改此按钮。我是通过以下方式完成的:

    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动画后将启动并且处理按钮消失后。但是,我希望原始按钮会再次显示。

3 个答案:

答案 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:方法替换按钮。