【问题标题】:Does the UISplitViewController have to be the root controller of an iPad app?UISplitViewController 是否必须是 iPad 应用程序的根控制器?
【发布时间】:2010-02-22 17:51:17
【问题描述】:

根据 Apple 关于 UISplitViewController 的文档(在新的 iPad 3.2 SDK 中),他们似乎打算让您仅将其用作应用程序的根控制器。换句话说...看起来你不能将 UISplitViewController 推送到 UINavigationController 上,因为显然 UINavigationController 需要保存拆分视图。

谁能确认这是否是 UISplitViewController 的真正限制?我希望在我的 UINavigationController 层次结构深处的几个级别的应用程序中使用拆分视图,但除非有办法,否则我似乎无法做到这一点。

谢谢!

【问题讨论】:

    标签: ipad uisplitviewcontroller iphone-sdk-3.2


    【解决方案1】:

    每当我尝试以模态方式呈现 UISplitViewController 时,我的应用程序就会崩溃。

    【讨论】:

    • 您得到一个未捕获的异常:“应用程序试图以模态方式呈现拆分视图控制器”[原文如此]
    【解决方案2】:

    这是一篇旧帖子,但我发现它可以帮助我以不同的方式思考,这就是我解决问题的方法。

    我以编程方式创建了我的splitViewController。然后我用一个数字标记它,并将它作为子视图添加到我当前的视图中。


    FirstViewController* firstView = [[[FirstViewController alloc] initWithNibName:@"FirstViewController" bundle:nil] autorelease];    
    SecondViewController* secondView = [[[SecondViewController alloc]  initWithNibName:@"SecondViewController" bundle:nil] autorelease];        
    UISplitViewController* splitVC = [[UISplitViewController alloc] init];
    [splitVC setDelegate:secondView];    
    splitVC.viewControllers = [NSArray arrayWithObjects:firstView, secondView, nil];    
    splitVC.view.tag = 99;    
    [self.view addSubview:splitVC.view];
    

    之后,splitView 会显示,但要摆脱它,我必须将其从视图中删除,因此我在 viewcontrollers 之间创建了一个通知。在主视图控制器中,我添加了观察者。 (注意:主视图控制器不是splitViewController 或其中一个视图,而是加载splitViewController 的视图控制器)

    NSNotificationCenter *splitViewObserver = [NSNotificationCenter defaultCenter];
    [splitViewObserver addObserver:self selector:@selector(removeSplitView) name:@"removeSplitView" object:nil];
    

    在选择器“removeSplitView”中,我将当前视图的所有子视图放入 for 循环中,并搜索标签为 99 的 UIView 类对象并将其从父视图中删除。

    NSArray *subviews = [self.view subviews];
    
    for (int i = 0; i < [subviews count]; i++) {
        if ([[subviews objectAtIndex:i] isKindOfClass:[UIView class]]) {
            UIView *tempView = [subviews objectAtIndex:i];
            if (tempView.tag == 99) {
                [[subviews objectAtIndex:i] removeFromSuperview];
            }
        }
    }
    

    在 firstView 中,我有一个名为 done 的方法,它发布主 ViewController 正在观察的通知。

    -(IBAction) done:(id)sender {       
        [fileSelectedNotification postNotificationName:@"removeSplitView" object:self];    
    }
    

    您还必须在应用中的某处创建fileSelectedNotification。我通过viewDidLoad 做到了这一点。看起来像这样。

    fileSelectedNotification = [NSNotificationCenter defaultCenter];
    

    我当然也加了这个

    NSNotiicationCenter *filesSelectedNotification;
    

    到这个viewController的.h文件。

    因此,当我按下完成按钮(这是我的应用程序上的条形按钮)时,它会从视图中删除 splitViewController

    工作正常。我只是从阅读文档中得到了这一切。

    【讨论】:

      【解决方案3】:

      Apple HIG 说你不能。意味着他们可能已经阻止你这样做,所以我怀疑你会得到它的工作。一些开发者已经编写了自己的

      【讨论】:

        【解决方案4】:

        一点也不。例如,可以在层次结构的根部有一个标签栏控制器,其中每个标签都有一个拆分视图控制器。

        请参阅我关于将拆分视图控制器改装为标签栏界面的帖子:http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uisplitviewcontroller.html

        【讨论】:

        • 技术上您可以这样做,但它会遇到错误 - 主要是当用户在其他选项卡上更改应用程序方向并返回拆分视图选项卡时。​​span>
        【解决方案5】:

        仅供参考,我认为这是要走的路:见类似question

        【讨论】:

          猜你喜欢
          • 2011-12-30
          • 1970-01-01
          • 2012-09-21
          • 1970-01-01
          • 1970-01-01
          • 2011-02-04
          • 1970-01-01
          • 2016-12-26
          • 1970-01-01
          相关资源
          最近更新 更多