Objective c 无nib/xib编程的UISplitViewController

Objective c 无nib/xib编程的UISplitViewController,objective-c,ipad,uisplitviewcontroller,Objective C,Ipad,Uisplitviewcontroller,我通常创建没有IB内容的项目。我要做的第一件事是去掉对xib、plist等的所有引用。没问题,很好用(在我的世界里) 现在,我刚刚安装了3.2,并尝试开发我的第一个iPad应用程序。按照与前面相同的步骤,我创建了一个基于UISplitView的应用程序项目,并剥离了所有IB内容。此外,我还遵循了苹果参考文档中的部分:,但尽管如此,主视图从未显示,只有细节视图显示(无论方向如何)。我真的试着仔细看了一遍,但我不明白我错过了什么 是否有一个UISplitViewController的工作示例,它的笔

我通常创建没有IB内容的项目。我要做的第一件事是去掉对xib、plist等的所有引用。没问题,很好用(在我的世界里)

现在,我刚刚安装了3.2,并尝试开发我的第一个iPad应用程序。按照与前面相同的步骤,我创建了一个基于UISplitView的应用程序项目,并剥离了所有IB内容。此外,我还遵循了苹果参考文档中的部分:,但尽管如此,主视图从未显示,只有细节视图显示(无论方向如何)。我真的试着仔细看了一遍,但我不明白我错过了什么


是否有一个UISplitViewController的工作示例,它的笔尖不在某个地方浮动?我在谷歌上搜索过,但没有找到。或者你知道我可能遗漏了什么吗?

在代理标题中声明splitviewcontroller,在DidFinishController中使用类似的内容

确保将UISPlitViewController删除门添加到detailedViewController头文件,并且还具有委托方法。记住导入相关的头文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    

    splitViewController = [[UISplitViewController alloc] init];

    rootViewController *root = [[rootViewController alloc] init];
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root];

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail];

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
    splitViewController.delegate = detail;

    [window addSubview:splitViewController.view];
编辑-根据下面Scott的建议,不要添加到windows子视图中

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that's the ticket
    [window makeKeyAndVisible];
    return YES;
}


//detailedView delegate methods
- (void)splitViewController:(UISplitViewController*)svc 
     willHideViewController:(UIViewController *)aViewController 
          withBarButtonItem:(UIBarButtonItem*)barButtonItem 
       forPopoverController:(UIPopoverController*)pc
{  
    [barButtonItem setTitle:@"your title"];



    self.navigationItem.leftBarButtonItem = barButtonItem;
}


- (void)splitViewController:(UISplitViewController*)svc 
     willShowViewController:(UIViewController *)aViewController 
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    self.navigationItem.leftBarButtonItem = nil;
}

与IB相比,我更喜欢代码;-)

老掉牙的线程,但当上述技术无法生成正确响应设备方向更改事件的UISplitViewController时,我想我会为读者节省时间和悲伤。您需要:

  • 确保所有下级视图在中正确响应 应自动旋转指针面方向。这里没什么新鲜事
  • 而不是将UISplitViewController的视图添加到主窗口

    [window addSubview:splitViewController.view];   // don't do this
    
    而是将主窗口的根控制器设置为UISplitViewController:

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that's the ticket
    

  • 将splitviewcontroller的视图添加为主窗口的子视图(勉强)允许它与同级视图同时显示,但它不符合UISplitViewController的预期用例。UISplitViewController是highlander视图;只能有一个。

    我刚刚遇到了同样的问题。 确保splitview的子viewController可以自动旋转到界面方向

    您可以按如下方式更改childViewController中的函数:

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
        return YES;
    }
    

    然后将显示主视图。

    Swift 5.2

    iOS 13

    主视图和局部视图控制器都嵌入在导航控制器中

        let splitViewController =  UISplitViewController()
        splitViewController.delegate = self
        let masterVC = MasterViewController() 
        let detailVC = DetailViewController()
        let masterNavController = UINavigationController(rootViewController: masterVC)
        let detailNavController = UINavigationController(rootViewController: detailVC)
        splitViewController.viewControllers = [masterNavController,detailNavController]
    
    您可以将此代码放在AppDelegate中(如果您的目标是iOS 13.0+)
    didFinishLaunchingWithOptions
    函数中,也可以放在SceneDelegate中。请记住将
    splitViewController
    设置为您的
    rootViewController

        self.window!.rootViewController = splitViewController
    

    这个答案正是我一直在寻找的。一个问题:在Apple的参考示例代码()中,它们在根视图控制器中处理UiSplitviewcontroller委托。您可以在详细控制器中处理它。有这样或那样的原因吗?成为代理的控制器取决于您。如果您觉得
    detailViewController
    将命令
    rootViewController
    ,这是完全正确的:)。虽然在这种情况下,您可能希望将变量重命名为适合您的设计的名称(例如
    listViewController
    mainViewController
    分别用于
    rootViewController
    detailedViewController
    ),但“我通常创建项目时没有IB内容。”在iOS 13中,您应该将此代码放在ScenedeLegate中。我应该早点修复它。谢谢我在“self.window!.rootViewController=splitViewController”中收到此错误消息:“线程1:致命错误:在展开可选值时意外发现nil”,因为窗口为nil。“我能做什么?”马库斯给窗户定了一个尺寸