iphone - 以编程方式将导航栏按钮更改为活动指示器

时间:2010-02-12 02:46:25

标签: iphone uinavigationbar uiactivityindicatorview

我在我的iPhone应用程序的导航栏上添加了刷新UIBarButtonItem。当用户点击按钮时,我希望刷新按钮更改为动画活动指示器,一旦操作(在这种情况下是下载)完成,将活动指示器切换回刷新按钮。

我已使用IB添加了刷新按钮。然后在按钮上点击我创建一个新的活动指示器并保持指向原始刷新按钮的指针。像这样:

refreshButtonItem = self.navigationItem.leftBarButtonItem;
if (activityButtonItem == nil)
{
    activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20,20)];
    activityButtonItem = [[UIBarButtonItem alloc]initWithCustomView:activityIndicator];

}
self.navigationItem.leftBarButtonItem = activityButtonItem;
[activityIndicator startAnimating];

到目前为止,这么好。问题是,当我的下载完成后,我尝试重新添加刷新按钮(使用以下内容):

[activityIndicator stopAnimating];
self.navigationItem.leftBarButtonItem = refreshButtonItem;

我收到以下错误:
 [UIBarButtonItem retain]:发送到解除分配的实例的消息

我没有明确地呼吁释放。

A)何时/何地被解除分配

B)有没有更好的方法来实现我正在寻找的东西?

2 个答案:

答案 0 :(得分:1)

当您将activityButtonItem指定给leftBarButtonItem时,将释放leftBarButtonItem用于指向的项目。 leftBarButtonItem(以及具有retain选项的所有属性)的实现与此类似:

- (void)leftBarButtonItem:(UIBarButtonItem *)newItem {
  if (newItem != self.leftBarButtonItem) {
    [self.leftBarButtonItem release];
    leftBarButtonItem = [newItem retain];
  }
}

如果要在重新分配leftBarButtonItem后使用refreshButtonItem,请将第一行更改为:

refreshButtonItem = [self.navigationItem.leftBarButtonItem retain];

答案 1 :(得分:0)

自iOS 5引入ARC以来,您不再需要保留。

解决方案可以在@cagreen解释时获得,而refreshButtonItem可以存储为类属性,以及loadingButton和loadingView。

在您的界面中声明:

@property (strong, nonatomic) UIBarButtonItem *refreshButton;
@property (strong, nonatomic) UIBarButtonItem *loadingButton;
@property (strong, nonatomic) UIActivityIndicatorView *loadingView;

在viewDidLoad方法中初始化loadingButton和loadingView:

self.loadingView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
self.loadingButton = [[UIBarButtonItem alloc] initWithCustomView:self.loadingView];

然后要显示加载微调器,您可以执行以下操作:

 // Shows loading button
- (void)showLoadingView {

    // Keep reference to right bar button
    if (self.navigationItem.rightBarButtonItem) {
        self.refreshButton = self.navigationItem.rightBarButtonItem;
    }

    // Start animating and assign loading button to right bar button
    [self.loadingView startAnimating];
    self.navigationItem.rightBarButtonItem = self.loadingButton;
}

隐藏:

 // Hides loading button
- (void)hideLoadingView {
    [self.loadingView stopAnimating];
    self.navigationItem.rightBarButtonItem = self.refreshButton;
}