iPhone - 以编程方式将导航栏按钮更改为事件指示器

标签 iphone uinavigationbar uiactivityindicatorview

我已将刷新 UIBarButtonItem 添加到 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保留]:发送到已释放实例的消息

我没有明确调用发布。

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 保留];

关于iPhone - 以编程方式将导航栏按钮更改为事件指示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2249363/

相关文章:

iphone - Cocoa:我可以按文件名排序,如何按文件扩展名排序?

ios - UINavigationbar barTintColor 在 UISplitview 模板中不起作用

ios - 在 View Controller 上添加导航栏

swift - 显示两个请求的指标

iphone - 在 NSTemporaryDirectory 内创建目录

ios - 第二个 View 的 viewdidload 需要时间进行调用,该调用是通过 Collection View 和 TableView didselect 从第一个 View 推送的

iphone - iOS 通用应用程序 : the Minimum OS Version is Different than the Deployment Target

ios - 标题有什么不同?

ios - objective-c -在tableview单元格上解析xml时显示事件指示器

ios - 在 tableview 显示之前添加加载 View Controller