UISplitViewController以编程方式没有nib / xib

时间:2010-05-03 10:47:55

标签: objective-c ipad uisplitviewcontroller

我通常创建没有IB东西的项目。我做的第一件事是剥离所有对xibs,outlet更新plist等的引用。没问题,效果很好(在我的世界里)!

现在,我刚刚安装了3.2并试图开发我的第一个iPad应用程序。按照与以前相同的步骤,我创建了一个基于UISplitView的应用程序项目,并剥离了所有IB的东西。此外,我按照Apple的参考文档中的部分:Creating a Split View Controller Programmatically,但是,从未显示主视图,只有详细视图(无论方向是什么)。我真的试着仔细看看,但我无法理解我错过了什么。

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

4 个答案:

答案 0 :(得分:58)

在你的委托标题中声明你的splitviewcontroller,在你的didfinishlaunching中使用这样的东西

确保将UISplitViewControllerDelegate添加到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];

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

答案 1 :(得分:23)

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

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

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

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

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that's the ticket
    
  3. 将splitviewcontroller的视图添加为主窗口的子视图(几乎没有)允许它与兄弟视图共存,但它不能与UISplitViewController的预期用例一起使用。 UISplitViewController是一个高地视图; 只能有一个

答案 2 :(得分:4)

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

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

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

然后将显示主视图。

答案 3 :(得分:0)

Swift 5.0 版本(主视图控制器和详细视图控制器都嵌入在导航控制器中)

    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的didFinishLaunchingWithOptions函数中。只需记住将splitViewController设置为rootViewController

    self.window!.rootViewController = splitViewController