我已将刷新 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/