我的一个应用程序中有一个非常简单的工具栏按钮,允许用户上传对象。在编辑对象时,我隐藏了工具栏(在编辑时不允许上传)。此外,我想启用/禁用上传按钮,具体取决于对象是否有任何尚未上传的更改。 (例如,成功上传后,上传按钮被禁用,编辑后但在上传之前已启用)
我有像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>>
总结:
答案 0 :(得分:0)
在写这个问题时,我意识到实际问题是什么:
我有时更新上传按钮标题(例如,当本地化发生变化时,因为这可能发生在我的应用程序的运行时)并且这样做我替换了所有barButtonItems。但我只将新的uploadButton添加到viewControllers -uploadButton
属性,而不是工具栏。
但是,由于我在成功更新后将属性中的uploadButton添加到工具栏,因此上传发生后问题就会消失,而且很少发生。
所以实际问题是: 添加到工具栏的UIBarButtonItem不是我的属性中保存的那个。相反,工具栏中的那个应该是旧的,应该被替换。因为我只设置保存在属性中的按钮的enabled属性,显然没有更改工具栏中的barButtonItem。 另外:我的property-barButtomItem没有-view,因为它尚未添加到工具栏中。
我希望其他有问题的UIBarbuttonItems无法正确更新可能会通过阅读我的问题走上正轨。 ; - )