如何使用Storyboard为SplitView iPad应用程序构建ViewControllers?

时间:2013-03-06 08:08:22

标签: ios objective-c ipad storyboard uisplitviewcontroller

我正在尝试为应用程序构建界面,如下所示: image of app

我想使用Storyboard来创建视图,但我现在无法弄清楚如何。我已经删除了一个连接到2个导航控制器的SplitViewController:MasterNavigationController和DetailNavigationController(Master是左侧菜单,Detail是右侧)。

我开始在故事板中构建所有的ViewControllers。然后构建NSArrays以保存每个Master菜单项所需的各种ViewController堆栈。因此,当用户点击菜单项时,我会使用此方法将相应的ViewController堆栈加载到DetailNavigationController中:

- (void)setViewControllers:(NSArray *)viewControllers animated:(BOOL)animated

但是现在我在想,我应该为每个菜单项创建一个单独的DetailNavigationController。例如:

  • RecentOrdersNavigationController
  • CustomersNavigationController
  • ItemsNavigationController
  • ...

然后,当用户点击一个菜单项时,整个DetailNavigationController将更改为相应的一个。

在使用故事板时,我应该如何构建界面?

1 个答案:

答案 0 :(得分:0)

为每个详细信息视图使用单独的viewController。您希望您的代码是独立的,因为它可以快速混淆每个视图的所有不同功能。从那里,您可以轻松地交换细节。

子类UISplitViewController并将您的根splitViewController设置为该类。然后将此方法添加到UISplitViewController子类:

-(void)setDetailControllerTo:(UIViewController *)detailController withNavControllerTitle:(NSString *)title {
[detailController view]; // this line forces the viewDidLoad method to be called

if (title) {
    UINavigationController *navController = [[UINavigationController alloc] init];
    [navController pushViewController:detailController animated:YES];
    detailController.title = title;

    NSArray *viewControllers=@[self.mainController.viewControllers[0],navController];
    self.mainController.viewControllers = viewControllers;
} else {
    NSArray *viewControllers=@[self.mainController.viewControllers[0],detailController];
    self.mainController.viewControllers = viewControllers;
}

}

要调用此方法,请从tableView中的主视图控制器执行以下操作:didSelectRowAtIndexPath:method

FixedSplitViewController *splitController = (FixedSplitViewController*) self.splitViewController;

CurrentEventViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"CurrentEventViewController"];
// add any setup code here
[splitController setDetailControllerTo:controller withNavControllerTitle:@"Current Event"];

如果您希望在纵向旋转中保持主视图可见,请将此方法添加到SplitViewController子类中:

-(BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return NO;
}

我的很多项目都要求splitviewcontroller始终显示主视图,所以我使用这个子类来保持主视图不会隐藏在纵向旋转上。