我在理解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属性?
答案 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
。