51

我通常在没有 IB 的情况下创建我的项目。我要做的第一件事是去掉所有对 xibs、网点更新 plist 等的引用。没问题,效果很好(在我的世界里)!

现在,我刚刚安装了 3.2 并尝试开发我的第一个 iPad 应用程序。按照与以前相同的过程,我创建了一个基于 UISplitView 的应用程序项目并剥离了所有 IB 材料。此外,我遵循了 Apple 参考文档中的部分:以编程方式创建拆分视图控制器,但是,主视图从未显示,只有详细视图(无论方向如何)。我真的试图仔细查看这一点,但我无法理解我错过了什么。

是否有 UISplitViewController 的工作示例没有笔尖漂浮在某处?我用谷歌搜索但找不到任何东西。或者你知道我可能错过了什么吗?

4

4 回答 4

62

在您的委托标题中声明您的 splitviewcontroller,在您的 didfinishlaunching 中使用类似的东西

确保将 UISplitViewControllerDelegate 添加到 detailViewController 头文件中,并且您也有委托方法。记得导入相关的头文件

- (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];

编辑 - 根据下面斯科特的优秀建议,不要添加到 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 ;-)

于 2010-06-04T21:23:57.427 回答
24

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

  1. 确保所有从属视图在 shouldAutorotateToInterfaceOrientation 中正确响应。这里没有什么新鲜事。
  2. 而不是将 UISplitViewController 的视图添加到主窗口,

    [window addSubview:splitViewController.view];   // don't do this
    

    而是将主窗口的根控制器设置为 UISplitViewController:

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

添加 splitviewcontroller 的视图作为主窗口的子视图(几乎)允许它与同级视图共同呈现,但它不符合 UISplitViewController 的预期用例。UISplitViewController 是一个高地视图;只能有一个

于 2012-01-17T01:35:50.843 回答
7

斯威夫特 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+,则放入 SceneDelegate)didFinishLaunchingWithOptions函数中。只要记住让splitViewControllerrootViewController喜欢这个

    self.window!.rootViewController = splitViewController
于 2019-05-02T21:44:43.603 回答
3

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

您可以像这样更改 childViewController 中的功能:

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

然后将显示主视图。

于 2012-02-15T07:32:57.717 回答