需要帮助了解新的Xcode 4.2 Master-Detail应用程序模板

时间:2011-10-31 04:54:02

标签: uinavigationcontroller ios5 uisplitviewcontroller xcode4.2

我在理解Master-Detail Application模板的所有“细节”如何使用Xcode 4.2(没有MainWindow.xib以及其他更改)时遇到了一些麻烦。在“AppDelegate”中,我们有以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.

    MasterViewController *masterViewController = [[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil];
    UINavigationController *masterNavigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];

    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    UINavigationController *detailNavigationController = [[UINavigationController alloc] initWithRootViewController:detailViewController];

    self.splitViewController = [[UISplitViewController alloc] init];
    self.splitViewController.delegate = detailViewController;
    self.splitViewController.viewControllers = [NSArray arrayWithObjects:masterNavigationController, detailNavigationController, nil];
    self.window.rootViewController = self.splitViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

我看到窗口是以编程方式创建的,而不是使用在开始时在以前版本的Xcode中使用的MainWindow.xib,以及为提供的“Master”和“Detail”视图控制器类实例化对象使用模板并将它们用于单独的UINavigationControllers。然后为splitViewController属性分配一个新分配的UISplitViewController对象,将detailViewController指定为“委托”,并创建一个包含UINavigationControllers作为“viewControllers”的数组。然后为window.rootViewController分配了这个splitViewController对象。

我遇到的主要问题是

1)为什么我需要两个“UINavigationControllers?”我不能只使用“主”和“细节”视图控制器本身创建“viewController”数组吗?“

2)将“detailViewController”设置为“委托”是什么做的?实际上被委派了什么?

3)最后,如果我想将其他项目推送到“DetailViewController”堆栈,我是否只使用“DetailViewController”类来推送使用“didSelectRow ..”方法,或者我是否需要更新到而不是self.splitViewController.viewControllers属性?

1 个答案:

答案 0 :(得分:0)

  

1)为什么我需要两个“UINavigationControllers?”我不能只使用“主”和“细节”视图控制器本身创建“viewController”数组吗?“

你不需要。但这是一种方式。您可以推送masterViewController以及detailViewController。查看Storyboard中的布局。使用segue,您可以根据需要更改每侧的控制器。

  

2)将“detailViewController”设置为“委托”是什么做的?实际上被委派了什么?

UISplitView获得委派。 detailViewController将处理纵向和横向模式中的界面更改。请参阅documentation中的UISplitViewDelegate

显示和隐藏视图控制器

– splitViewController:shouldHideViewController:inOrientation:
– splitViewController:willHideViewController:withBarButtonItem:forPopoverController:
– splitViewController:willShowViewController:invalidatingBarButtonItem:
– splitViewController:popoverController:willPresentViewController:
  

3)最后,如果我想将其他项目推送到“DetailViewController”堆栈,我是否只使用“DetailViewController”类来推送使用“didSelectRow ..”方法,或者我是否需要更新到而不是self.splitViewController.viewControllers属性?

是的,您可以使用tableView选项推送masterViewController。您可以通过推入

来推送masterViewController堆栈上的新控制器
- (void)viewDidAppear:(BOOL)animated

你可以以任何你喜欢的方式推进。您不必更新self.splitViewController.viewControllers属性。也许你必须将代表设置为新的detailViewController