我正在使用拆分视图控制器的应用程序。 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没有完全创建该对象,特别是工具栏属性尚不存在。我想我将不得不弄清楚如何在此过程中添加条形按钮项目。
答案 0 :(得分:0)
不确定这是最好的解决方案,但我认为条形按钮项目未添加到标题的原因是标题尚未添加到segue提供的新细节VC对象中。我通过在VC的viewDidLayoutSubviews方法中添加以下行来解决这个问题:
self.splitViewBarButtonItem = self.splitViewBarButtonItem;
这会再次调用setter,但这次是在标题栏存在之后。