无法将项目添加到 UIToolbar
Posted
技术标签:
【中文标题】无法将项目添加到 UIToolbar【英文标题】:Trouble adding item to UIToolbar 【发布时间】:2013-04-01 15:52:13 【问题描述】:我正在开发一个带有拆分视图控制器的应用程序。 master 是标签栏控制器的子类,是拆分视图控制器的委托。这部分似乎工作正常,它确实将正确的信息推送到了细节方面——除了拆分视图控制器生成的条形按钮项。
我有一个 UIToolbar,它在 Xcode 中被拖到项目中唯一的细节视图控制器上。我使用 ctrl-drag 在 Xcode 中为公共 API 设置了一个出口。
在公共 API 中还声明了一个 UIBarButtonItem *splitViewBarButtonItem,声明为弱的、非原子的。
这是该项目的设置器:
-(void)setSplitViewBarButtonItem:(UIBarButtonItem *)barButtonItem
NSLog(@"%@ setSplitViewBarButtonItem to %@ (%@)",self,barButtonItem,barButtonItem.title);
//UIToolbar *toolbar = [self toolbar];
UIToolbar *toolbar = self.toolbar;
NSLog(@"toolbar[0] before adding the barButtonItem is %@",toolbar.items[0]);
NSMutableArray *toolbarItems = [toolbar.items mutableCopy];
if (_splitViewBarButtonItem)
NSLog(@"Removing _splitViewBarButtonItem from toolbarItems");
[toolbarItems removeObject:_splitViewBarButtonItem];
NSLog(@"toolbarItems[0] is %@",toolbarItems[0]);
if (barButtonItem)
NSLog(@"#####");
NSLog(@"Now adding %@ to toolbarItems",[barButtonItem description]);
[toolbarItems insertObject:barButtonItem atIndex:0];
NSLog(@"toolbarItems[0] is %@",[toolbarItems[0] description]);
NSLog(@"#####");
self.toolbar.items = [toolbarItems copy];
NSLog(@"self.toolbar.items[0] is %@",self.toolbar.items[0]);
_splitViewBarButtonItem = barButtonItem;
第一次通过时,它的行为符合预期:
2013-04-01 10:33:46.270 SPoT[10389:907] <IViewController: 0x1e066430> setSplitViewBarButtonItem to <UIBarButtonItem: 0x1cd65490> (Text appearing on the button)
2013-04-01 10:33:46.272 SPoT[10389:907] toolbar[0] before adding the barButtonItem is <UIBarButtonItem: 0x1cd65400>
2013-04-01 10:33:46.275 SPoT[10389:907] #####
2013-04-01 10:33:46.277 SPoT[10389:907] Now adding <UIBarButtonItem: 0x1cd65490> to toolbarItems
2013-04-01 10:33:46.278 SPoT[10389:907] toolbarItems[0] is <UIBarButtonItem: 0x1cd65490>
2013-04-01 10:33:46.280 SPoT[10389:907] #####
2013-04-01 10:33:46.288 SPoT[10389:907] self.toolbar.items[0] is <UIBarButtonItem: 0x1cd65490>
但是,如果我使用按钮激活主控,从而使按钮消失并使用主控用新数据刷新详细信息屏幕,则按钮的传输不会占用。我已将问题追溯到此方法,其中显示按钮可用但未更新。这是第二次运行的调试器输出:
2013-04-01 10:33:53.491 SPoT[10389:907] <IViewController: 0x1e09fad0> setSplitViewBarButtonItem to <UIBarButtonItem: 0x1cd65490> (Text appearing on the button)
2013-04-01 10:33:53.492 SPoT[10389:907] toolbar[0] before adding the barButtonItem is (null)
2013-04-01 10:33:53.493 SPoT[10389:907] #####
2013-04-01 10:33:53.494 SPoT[10389:907] Now adding <UIBarButtonItem: 0x1cd65490> to toolbarItems
2013-04-01 10:33:53.495 SPoT[10389:907] toolbarItems[0] is (null)
2013-04-01 10:33:53.496 SPoT[10389:907] #####
2013-04-01 10:33:53.497 SPoT[10389:907] self.toolbar.items[0] is (null)
请注意,调试器跟踪状态为“现在添加”,因此该项目可用。那为什么不添加呢?
编辑:现在我在想,由于“添加 barButtonItem 之前的工具栏 [0] 是(null)”,因此生成新细节控制器的对象 id 的 segue 尚未完全创建该对象,具体来说,工具栏属性尚不存在。我想我必须在这个过程的后面弄清楚如何添加栏按钮项。
【问题讨论】:
【参考方案1】:不确定这是最好的解决方案,但我认为条形按钮项未添加到标题的原因是标题尚未添加到 segue 提供的新细节 VC 对象中。我通过在详细 VC 的 viewDidLayoutSubviews 方法中添加以下行解决了这个问题:
self.splitViewBarButtonItem = self.splitViewBarButtonItem;
这会再次调用设置器,但这次是在标题栏存在之后。
【讨论】:
以上是关于无法将项目添加到 UIToolbar的主要内容,如果未能解决你的问题,请参考以下文章