iphone - 以编程方式将导航栏按钮更改为活动指示器
我已将刷新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)有没有更好的方式来实现我在寻找什么呢?
当您将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];
由于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;
}
工作就像一个魅力!谢谢。 – cagreen 2010-02-12 03:48:05