无法将项目添加到UIToolbar

时间:2013-04-01 15:52:13

标签: uisplitviewcontroller uibarbuttonitem uitoolbar

我正在使用拆分视图控制器的应用程序。 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之前的”toolbar [0]是(null)“生成新细节控制器的对象id的segue没有完全创建该对象,特别是工具栏属性尚不存在。我想我将不得不弄清楚如何在此过程中添加条形按钮项目。

1 个答案:

答案 0 :(得分:0)

不确定这是最好的解决方案,但我认为条形按钮项目未添加到标题的原因是标题尚未添加到segue提供的新细节VC对象中。我通过在VC的viewDidLayoutSubviews方法中添加以下行来解决这个问题:

self.splitViewBarButtonItem = self.splitViewBarButtonItem;

这会再次调用setter,但这次是在标题栏存在之后。