无法将项目添加到 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的主要内容,如果未能解决你的问题,请参考以下文章

无法将图像添加到标签栏项目反应导航

无法将 ws 库添加到 Angular 项目

无法将本地数据库添加到项目

将核心数据添加到我的项目时无法添加 sql 文件

无法将特定项目添加到 activity_main.xml

无法将项目添加到 UIToolbar