【问题标题】:iPad UISplitView Detail Toolbar NULL on StartupiPad UI 拆分视图详细信息工具栏在启动时为 NULL
【发布时间】:2011-02-23 22:13:47
【问题描述】:

我一直在绞尽脑汁试图找出我正在开发的应用程序的 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>>

如您所见,后续日志显示工具栏运行良好,而且我们知道在所有情况下调用都来自同一个对象。这些后来的调用只是来自旋转到横向然后再回到纵向,所以它肯定也是同一个细节视图控制器。

所以我的问题是:什么会导致工具栏第一次返回为空,但在除了旋转 iPad 什么都不做之后才能正常工作,我能做些什么来解决它?

提前致谢, 瑞恩

【问题讨论】:

    标签: ipad uisplitviewcontroller uitoolbar


    【解决方案1】:

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

    它不漂亮,但它有效。

    【讨论】:

      【解决方案2】:

      瑞恩

      我遇到了和你完全相同的问题,这对我很有帮助。我对您的解决方案有一个变体,它更容易一些。几个关键点。

      我将 Master 保留为 UISplitViewControllerDelegate,但我在我的详细视图 Controller.h 中添加了此属性(并在 .m 中合成它):

      @property (nonatomic, strong) UIBarButtonItem *popoverButton;
      

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

      然后在Detail视图控制器的viewDidLoad中,我只是在工具栏中设置了那个item。

      -(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 的出口才存在,那么一个人该怎么办?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多