Нужна помощь в понимании нового шаблона приложения Xcode 4.2 Master-Detail - PullRequest
4 голосов
/ 31 октября 2011

У меня возникли проблемы с пониманием того, как все «гайки и болты» шаблона приложения Master-Detail работают с использованием 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;
}

Я вижу, что окно создается программно вместо использования MainWindow.xib, который использовался в предыдущих версиях XCode в начале, а также создания экземпляровобъекты для классов контроллера «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 голосов
/ 05 декабря 2011

1) Зачем мне два "UINavigationControllers"?Не могу ли я просто создать массив «viewController», используя сами «основные» и «подробные» контроллеры представления? »

Вам не нужно. Но это способ. У вас есть возможностьнажмите masterViewController, а также detailViewController. Посмотрите на макет в раскадровке. С помощью segue вы можете менять контроллеры с каждой стороны по своему усмотрению.

2) Что он делаетустановить "detailViewController" в качестве "делегата?" Что на самом деле делегируется?

Делегируется UISplitView. detailViewController позаботится об изменении интерфейса в портретном и альбомном режимах. См.UISplitViewDelegate в документации .

Отображение и скрытие контроллеров представления

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

3) И, наконец, если я хочу добавить дополнительные элементы вСтек «DetailViewController», я бы просто использовал класс «DetailViewController» для проталкивания, используя метод «didSelectRow ..», или вместо этого мне нужно было бы обновить свойства self.splitViewController.viewControllers?

Да, вы можете нажать masterViewController с помощью выбора tableView.Вы можете нажать либо с новым контроллером в стеке masterViewController, нажав

- (void)viewDidAppear:(BOOL)animated

, и вы можете нажать любым способом, каким захотите.Вам не нужно обновлять свойство self.splitViewController.viewControllers.Может быть, вам нужно установить делегата для вашего нового detailViewController.

...