工具栏中的UIBarButtonItem有时没有"视图"并且无法启用/禁用

时间:2014-07-04 09:32:34

标签: ios objective-c uibarbuttonitem uitoolbar

我的一个应用程序中有一个非常简单的工具栏按钮,允许用户上传对象。在编辑对象时,我隐藏了工具栏(在编辑时不允许上传)。此外,我想启用/禁用上传按钮,具体取决于对象是否有任何尚未上传的更改。 (例如,成功上传后,上传按钮被禁用,编辑后但在上传之前已启用)

我有像uploadtutton这样的属性

@property UIBarButtonItem *uploadButton;

并在viewDidLoad中设置如下:

self.uploadButton = [[UIBarButtonItem alloc] initWithTitle:@"Upload" style:UIBarButtonItemStyleDone target:self action:@selector(upload:)];

在上传操作过程中,我使用工具栏显示上传的进度条,但在此之前和上传后,我将上传按钮添加到工具栏中,如下所示:

NSArray *toolbarItems = @[[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL],
                             self.uploadButton,
                             [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:NULL]];
            [self setToolbarItems:toolbarItems animated:YES];

但是,有时设置self. self.uploadButton.enabled属性似乎没有效果(按钮的外观不会更改)。如果按钮应该已启用但似乎已禁用,我使用调试器进行了检查,发现self.uploadButton.enabled实际上已正确设置,甚至在实际更改事件后仍为YES

然后我更深入地研究了视图层次结构并发现了一些奇怪的事情:

(lldb) po [[0xf72eba0 uploadButton] view]
 nil

(指针指向视图控制器对象,因此它与上面的“self”相同) 另外:[0xf72eba0 uploadButton]是非零的,因此不是消息传递nil的情况。 并且:yes -view不是UIBarButtonItem上的文档化方法,但由于UIBarButtonItem不是UIView本身,我认为它必须有一个视图,显然我是对的。

将其置于上下文中,以下

(lldb) po [[0xf72eba0 editButtonItem] view]
<UINavigationButton: 0xf782de0; frame = (645 8; 42 30); opaque = NO; layer = <CALayer: 0xf784500>>

一个视图。同样在后续运行中,当一切按预期工作时,上传按钮也有一个视图:

(lldb) po [[0xf72eba0 uploadButton] view]
<UIToolbarTextButton: 0x1196eb40; frame = (323 0; 57 44); opaque = NO; layer = <CALayer: 0x1196f330>>

总结:

  • uploadButton未发布,它是一个强大的属性。此外,当我检查时,它仍然存在。
  • 已正确设置已启用的属性。
  • 奇怪的是,有时uploadButton似乎没有-view。这似乎与它未正确更新有关。

1 个答案:

答案 0 :(得分:0)

在写这个问题时,我意识到实际问题是什么:

我有时更新上传按钮标题(例如,当本地化发生变化时,因为这可能发生在我的应用程序的运行时)并且这样做我替换了所有barButtonItems。但我只将新的uploadButton添加到viewControllers -uploadButton属性,而不是工具栏。

但是,由于我在成功更新后将属性中的uploadButton添加到工具栏,因此上传发生后问题就会消失,而且很少发生。

所以实际问题是: 添加到工具栏的UIBarButtonItem不是我的属性中保存的那个。相反,工具栏中的那个应该是旧的,应该被替换。因为我只设置保存在属性中的按钮的enabled属性,显然没有更改工具栏中的barButtonItem。 另外:我的property-barButtomItem没有-view,因为它尚未添加到工具栏中。

我希望其他有问题的UIBarbuttonItems无法正确更新可能会通过阅读我的问题走上正轨。 ; - )