Требуется разъяснение RootViewController

#objective-c #ios #cocoa-touch #uiviewcontroller #uikit

#objective-c #iOS #cocoa-touch #uiviewcontroller #uikit

Вопрос:

Справедливо ли говорить, что контроллер, определенный как часть MainWindow.xib, является корневым контроллером приложения?

Кроме того, верно ли предположить, что RootController всегда отвечает за то, какое представление отображается пользователю?

Комментарии:

1. Не всегда. У меня rootviewcontroller иногда устанавливается на NavigationController. И в настройках проекта вы можете указать Xib, который загружается первым при запуске. Но, кроме этого, да, rootviewcontroller может размещать вложенные представления и открывать другие, но navigationcontrollers являются настоящими лидерами при попытке решить, какое представление представить пользователям.

Ответ №1:

Это имеет место в некоторых стандартных проектах на основе окон IB, но, в конечном счете, вам нужно окно и представление, чтобы показать что-то пользователю.

Просто представление:

Подумайте об этом. Я создал пустой проект, добавил представление (просто MyView.xib), добавил кнопку к этому и этому коду. Нет корневых контроллеров — только окно и представление.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    UINib *nib = [UINib nibWithNibName:@"MyView" bundle:nil];
    UIView *myView = [[nib instantiateWithOwner:self options:nil] objectAtIndex:0];

    [[self window] addSubview:myView];
    [self.window makeKeyAndVisible];
    return YES;
}
  

Для типичного окна на основе:

-info.plist указывает на MainWindow.xib (базовое имя основного файла nib), владелец файла указывает на делегата приложения, ViewController делегата приложения указывает на UIViewController . Затем, как правило, для window RootViewController устанавливается значение ViewController, указанное выше.

 - (BOOL)application:(UIApplication *)application didFinis hLaunchingWithOptions:    (NSDictionary *)launchOptions
{

    self.window.rootViewController = self.viewController;
  

Но, если вы посмотрите на это приложение на основе навигации (проект MasterDetail), там нет MainWindow.xib.

main.m указывает на AppDelegate .

делегат приложения создает главный контроллер в NavigationController, а NavigationController, который был создан программно, становится rootViewContoller

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

    MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease];
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}
  

И, наконец, в этом программном примере windows RootViewController даже не установлен.
Представление контроллера навигации добавляется непосредственно в окно. В конце дня в окне просто размещается представление. Вы можете установить его или корневой контроллер может управлять им.

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // create window since nib is not.
    CGRect windowBounds = [[UIScreen mainScreen] applicationFrame];
    windowBounds.origin.y = 0.0;
    [self setWindow:[[UIWindow alloc] initWithFrame:windowBounds]];

    // create the rootViewController
    _mainViewController = [[MainViewController alloc] init];

    // create the navigationController by init with root view controller
    _navigationController = [[UINavigationController alloc] initWithRootViewController:_mainViewController];

    // in this case, the navigation controller is the main view in the window
    [[self window] addSubview:[_navigationController view]];

    [self.window makeKeyAndVisible];
    return YES;
}