Подтвердить что ты не робот

Self.window.rootViewController vs window addSubview

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

- (void)applicationDidFinishLaunching:(UIApplication *)application

есть

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

в отличие от

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

Есть ли практическая причина использовать один над другим? Правильно ли это? Контроллер имеет эквивалентную команду для номера (2), например

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

4b9b3361

Ответ 1

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

Старая техника заключалась в использовании addSubview.

Новый рекомендованный метод - установить rootViewController.

Ответ 2

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

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

Настройка окна rootViewController, как указано выше, также исправит это.

Ответ 3

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

    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];
    }

Ответ 4

Мое мнение:

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

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

Например, если вы установитеRootViewController на NavigationController, навигационный контроллер будет (0,0,320,480);

но если вы установитеRootViewController на общий UIViewController, навигационный контроллер будет (0,0,320,460);

если вы используете addSubview: два диспетчера просмотра будут (0,0,320,480)

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

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

Ответ 5

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

-setRootViewController не существует до iOS 4.0. Используйте

[self.window addSubview:self.tabBarController.view]; вместо этого.

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