self.window.rootViewController против окна addSubview - PullRequest
49 голосов
/ 09 марта 2011

Я заметил много примеров приложений для iPhone в Application Delegate

- (void)applicationDidFinishLaunching:(UIApplication *)application

есть

[window addSubview: someController.view]; (1)

в отличие от

self.window.rootViewController = self.someController; (2)

Есть ли практическая причина использовать один над другим? Один технически правильный? У контроллера есть команда, эквивалентная номеру (2), как

self.someController.rootController = self.someOtherController; // pseudocode

Ответы [ 5 ]

49 голосов
/ 09 марта 2011

Свойство UIWindow rootViewController является новым для iOS4.

Старая техника должна была использовать addSubview.

Новая, рекомендуемая техника: rootViewController.

10 голосов
/ 23 октября 2012

Просто обновление об этом с выпуском ios 6.

Если вы все еще используете шаблон - [UIWindow addubview:], вы, вероятно, получите сообщение «Ожидается, что окна приложений будут иметь контроллер корневого представления.в конце запуска приложения "теперь и в вашей консоли.Наряду с потенциальными проблемами вращения и компоновки в вашем приложении.

Установка rootViewController окна, как описано выше, также исправит это.

5 голосов
/ 04 ноября 2011

Я использую этот код:

    rootViewController_ = [[RootViewController alloc] initWithFrame:[UIScreen mainScreen].bounds];
    window_ = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    if ([window_ respondsToSelector:@selector(setRootViewController:)]) { // >= ios4.0
        [window_ setRootViewController:rootViewController_];
    } else { // < ios4.0
        [window_ addSubview:rootViewController_.view];
    }
1 голос
/ 10 сентября 2012

Мое мнение:

self.window.rootViewController изменит размер rootViewController.view в соответствии с высотой строки состояния

Но если вы используете addSubview, он не будет

Например,если вы установитеRootViewController в NavigationController, navigationController будет иметь значение (0,0,320,480);

, но если вы установите для RootViewController общий UIViewController, навигационный контроллер будет иметь значение (0,0,320,460);используйте addSubview: два viewcontrollers были бы (0,0 320,480)

И если есть In-call-StatusBar.это также изменится для вас, когда вы используете setRoot ... если вы используете addSubview, размер подпредставления не изменится

сделайте несколько тестов с другим цветом границы представления

0 голосов
/ 06 августа 2011

Сбой в том, что вы вызываете метод, который не существует, а не потому, что ваши переменные не инициализированы.

-setRootViewController не существует до iOS 4.0.Вместо этого используйте

[self.window addSubview:self.tabBarController.view];.

Или обновите целевой платформу до 4.0.2 или более поздней.Вероятно, менее 5% пользователей не используют iOS 4 на данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...