Ipad 如何将UISplitViewController用作模态视图控制器?

Ipad 如何将UISplitViewController用作模态视图控制器?,ipad,ios,uisplitviewcontroller,modalviewcontroller,Ipad,Ios,Uisplitviewcontroller,Modalviewcontroller,我正试图在我的iPad应用程序中显示一个UISplitViewController,将其显示为一个模态视图控制器。我设法让它显示出来,但由于某种原因,模态视图左侧有一个间隙,即状态栏的大小,当方向改变时,状态栏也会保留下来 有人知道为什么会这样吗?或者这是否可能?也许我只是在给自己挖一个大洞。股票UISplitViewController只设计用作根视图控制器。以模式呈现一个应用程序违反了苹果的人机界面准则,很有可能被应用程序审查团队拒绝。此外,您可能会收到以下错误: 应用程序试图以模式显示拆

我正试图在我的iPad应用程序中显示一个UISplitViewController,将其显示为一个模态视图控制器。我设法让它显示出来,但由于某种原因,模态视图左侧有一个间隙,即状态栏的大小,当方向改变时,状态栏也会保留下来


有人知道为什么会这样吗?或者这是否可能?也许我只是在给自己挖一个大洞。

股票
UISplitViewController
只设计用作根视图控制器。以模式呈现一个应用程序违反了苹果的人机界面准则,很有可能被应用程序审查团队拒绝。此外,您可能会收到以下错误:

应用程序试图以模式显示拆分视图控制器


从技术上讲,我就是这么做的:

1/为UIViewController子类,即@interface aVC:UIViewController

2/在viewDidLoad中,设置splitViewController,即aSplitVC

3/然后self.view=aSplitVC.view


毕竟,将aVC作为modalViewController呈现

我同意Evan的观点,即这对苹果来说有点不太合适,但我能够通过以下解决方案完成此版本的工作:

UISplitViewController *splitVC = [[UISplitViewController alloc] init];
    splitVC.delegate = VC2;
    splitVC.viewControllers = [NSArray arrayWithObjects:navcon1, navcon2, nil];

    UINavigationController *splitNavCon = [[UINavigationController alloc] init];
    splitNavCon.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [splitNavCon.view addSubview:splitVC.view];
    VC2.splitParentViewController = splitNavCon;

    [self presentViewController:splitNavCon animated:YES completion:nil];
这使我能够在新的UISplitViewController中使用一个后退按钮,该按钮以模式显示在屏幕上

您会注意到,我实际上将VC2(UISplitViewController的委托)传递给其父UINavigationController。这是我发现的从VC2中删除UISplitViewController的最佳方法:

[splitParentViewController dismissViewControllerAnimated:YES completion:nil];

和你们中的许多人一样,我需要一种“模式方式”来使用UISplitViewController。这似乎是一个老问题,但我在StackOverflow中发现的最多只是一个解释,解释了为什么当您尝试这样做时会出现问题(如上面接受的答案),或者“黑客绕过”

然而,有时仅仅为了启动和运行UISplitViewController的功能而更改大部分代码库并将其作为初始对象也不是很方便

事实证明,有一种方法可以让每个人都开心(包括苹果的指导方针)。我发现最好的解决方案是正常使用UISplitViewController,但当需要显示/取消显示时,请使用以下方法:

-(void)presentWithMasterViewController: (UIViewController *) thisMasterViewController
   andDetailViewController: (UIViewController *) thisDetailViewController
                        completion:(void(^)(void))completion
{
    masterViewController = thisMasterViewController;
    detailViewController = thisDetailViewController;

    [self setViewControllers:[NSArray arrayWithObjects:masterViewController, detailViewController, nil]];

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;

    self.window.rootViewController = self;

    [self.window makeKeyAndVisible];

    if(completion)
        completion();
    }

-(void)dismissViewControllerWithCompletion:(void (^)(void))completion
 {
     self.window = nil;
     masterViewController = nil;
     detailViewController = nil;
     if(completion)
         completion();
 }
其中“窗口”是UISplitViewController子类的属性。系统会处理剩下的事情

为了方便/参考,我将其作为UISplitViewController子类上载到gitHub:

--关于如何使用的示例--

旁注:我想大部分的困惑源于以下事实 Apple文档中的UISplitView使用示例使用该窗口 在appDelegate中创建,因为大多数人不是 非常熟悉窗口的概念-因为我们通常不需要 到(它们在故事板或样板代码中创建一次)

此外,如果您正在执行状态恢复,则不应执行此操作 忘记以编程方式创建的UIViewController不会
由系统自动恢复。

我相信可以采用另一种方法:不使用自定义控制器显示拆分控制器,可以将拆分控制器设置为情节提要中的根窗口控制器,并在其视图顶部添加自定义控制器(即登录屏幕)并将其从屏幕上删除(例如从SuperView中删除)当需要时。

这个答案实际上并不正确,因为它自iOS8以来就不再有效,如果您需要支持iOS7,您可以这样做,就像您实际放置UIViewController一样,它有一个容器作为SplitView

let mdSplitView = self.storyboard?.instantiateViewControllerWithIdentifier("myDataSplitView") as! MyData_SplitVC
    self.addChildViewController(mdSplitView)

    mdSplitView.view.bounds = self.view.bounds
    self.view.addSubview(mdSplitView.view)
    mdSplitView.didMoveToParentViewController(self)

这里的基本思想已经足够好了,但是如果其他东西没有保留它,ARC可能会吃掉
UISplitViewController
。因此,如果视图的子视图在以这种方式呈现后消失,请将其移动到属性或其他地方。另一种方法是尝试在售后市场上安装splitview控制器,以确定其大小,例如不在Xcode 8、iOS 8上工作+有错误日志:“一个视图一次最多只能与一个视图控制器关联!”
let mdSplitView = self.storyboard?.instantiateViewControllerWithIdentifier("myDataSplitView") as! MyData_SplitVC
    self.addChildViewController(mdSplitView)

    mdSplitView.view.bounds = self.view.bounds
    self.view.addSubview(mdSplitView.view)
    mdSplitView.didMoveToParentViewController(self)