启动时iPad UISplitView详细工具栏为NULL

时间:2011-02-23 22:13:48

标签: ipad uisplitviewcontroller uitoolbar

我一直绞尽脑汁试图找出iPad正在制作的应用程序中的一半小错误。这与这篇文章中的问题有关:

iPad SplitViewController Strange Behaviour

实际上,我应该说这是完全相同的问题。但是,那里给出的唯一解决方案对我来说不起作用,因为我的应用程序有一个主菜单,当按下正确的按钮时,它会切换到我的UISplitViewController的视图。在按下按钮之前,不会创建控制器及其包含的视图控制器。因此,在调用[window makeKeyAndVisible]之前,我无法设置控制器的委托,因为当我的主菜单加载时,这就完成了。

现在,我已经为委托的willHideViewController函数添加了一些NSLog调用,如下所示:

NSLog(@"Will hide popover view controller!");
NSLog(@"self=%p",self);
NSLog(@"%@",detailPad.tbToolbar);

当我在iPad上以纵向模式启动应用程序,然后单击切换到拆分视图控制器时,委托人的willHideViewController确实被调用,但是当它完成时,我在详细视图中留下了一个空工具栏。关于这一点的奇怪之处在于,第三个NSLog调用应该输出有关详细视图控制器工具栏的信息,而是吐出(null)。由于前面的代码设置了工具栏的项目,并且此代码不会引发单个异常,即使工具栏显然不存在,这也会有点奇怪。

[Session started at 2011-02-23 16:16:59 -0500.]  
2011-02-23 16:17:02.626 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:17:02.628 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:17:02.629 TEST[33835:207] (null)  
2011-02-23 16:17:14.487 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:17:14.488 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:17:14.490 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>>  
2011-02-23 16:24:52.158 TEST[33835:207] Will hide popover view controller!  
2011-02-23 16:24:52.159 TEST[33835:207] self=0x5351bc0  
2011-02-23 16:24:52.160 TEST[33835:207] <UIToolbar: 0x56201a0; frame = (0 0; 703 44); autoresize = W+BM; layer = <CALayer: 0x5620260>>

正如您所看到的,后续日志显示工具栏还活着,我们知道在所有情况下调用都来自同一个对象。这些后来的调用只是从旋转到横向然后再回到肖像,所以它绝对是同样的细节视图控制器。

所以我的问题是:第一次导致工具栏返回null的原因是什么,但是在除了旋转iPad之后什么都不做,然后我可以做些什么来解决它?

先谢谢, 莱恩

2 个答案:

答案 0 :(得分:1)

而且......我找到了解决方法。我将主视图控制器设置为拆分视图控制器的委托,这通常很好。但是,第一次调用HideViewController实际上是在详细视图设置之前发生的;这就是为什么工具栏还没有存在的原因。我把几件东西移到了细节控制器上,然后把它变成了委托。然后,除了在willHideViewController中设置工具栏的项目之外,我还在viewDidLoad中设置它们。详细视图控制器还将弹出按钮和控制器交给主视图控制器,因为主控器需要能够创建新的详细视图控制器并立即为它们分配弹出按钮(我忽略了之前提到的细节视图控制器被推并从导航控制器中弹出。)

它很漂亮,但它确实有效。

答案 1 :(得分:0)

赖安

我遇到了和你一样的问题,这真的对我很有帮助。我对您的解决方案有一个变化,这更容易一些。几个关键点。

我离开了Master作为UISplitViewControllerDelegate,但我在我的细节View Controller.h上添加了这个属性(并在.m中合成):

@property (nonatomic, strong) UIBarButtonItem *popoverButton;

然后在调用主视图控制器的prepareForSegue中,我得到了存储在该属性中的UIBarButtonItem。

然后在Detail视图控制器的viewDidLoad中,我只是在工具栏中设置该项。

-(void) viewDidLoad{
[super viewDidLoad];
[self setSplitViewBarButtonItem:self.popoverButton];}

,其中

-(void) setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem{
if (_splitViewBarButtonItem!=splitViewBarButtonItem) {
    NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy];
    if (_splitViewBarButtonItem) {
        [toolbarItems removeObject:_splitViewBarButtonItem];
    }
    if (splitViewBarButtonItem) {
        [toolbarItems insertObject:splitViewBarButtonItem atIndex:0];
    }
    self.toolbar.items=toolbarItems;
    _splitViewBarButtonItem = splitViewBarButtonItem;
}

}

感觉就像一个TOTAL hack,但是如果你在viewDidLoad中,在详细视图控制器中输出self.toolbar是不存在的,那么该怎么办?