2010-02-12 64 views
2

我已将刷新UIBarButtonItem添加到我的iPhone应用程序的导航栏中。当用户点击按钮时,我希望刷新按钮变成动画活动指示器,一旦操作(在这种情况下为下载)完成后,将活动指示器切换回刷新按钮。iphone - 以编程方式将导航栏按钮更改为活动指示器

我已经使用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挽留]:消息发送到释放实例

我没有明确调用release。

A)当/这哪里是在解除分配

B)有没有更好的方式来实现我在寻找什么呢?

回答

1

当您将activityButtonItem分配给leftBarButtonItem时,释放了LeftBarButtonItem用来指向的项目。该leftBarButtonItem(并与保留选项所有属性)实现类似功能的这样:

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

如果你想重新分配leftBarButtonItem后使用refreshButtonItem,你的第一行更改为:

refreshButtonItem = [self.navigationItem.leftBarButtonItem retain];

+0

工作就像一个魅力!谢谢。 – cagreen 2010-02-12 03:48:05

0

由于iOS 5引入了ARC,因此不再需要保留。

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

在你的界面声明:

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

初始化loadingButton和loadingView在您的viewDidLoad方法:

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; 
} 
相关问题