Действительно ли MainWindow.xib нужен в приложении iOS?

#xcode #interface-builder #ios5 #xib

#xcode #конструктор интерфейса #ios5 #xib

Вопрос:

Перед выполнением любого типа разработки iOS 5.0 с использованием Xcode 4.2, Xcode предоставил «MainWindow.xib» в шаблонах. После загрузки и воспроизведения с Xcode 4.2 с iOS 5.0 я заметил, что ни один из предоставленных шаблонов не содержит файлов «MainWindow.xib». Нужно ли нам это еще? Я заметил, что в методе «application didFinishLaunchingWithOptions» в App_Delegate шаблоны теперь включают код, который создает некоторый «UIWindow», и если у вас есть какие-либо навигационные контроллеры, он соответствующим образом обновляет окно.

 // code that was pulled from a Master Detail application template
- (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];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:masterViewController];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;
}
  

Я думаю, мой вопрос в том, нужен ли мне «MainWindow.xib» больше, и если да, то почему шаблоны Apple исключают их?

Ответ №1:

Всегда была возможность не использовать MainWindow.xib. UIWindow можно загрузить программно, выполнив следующее:

1) Убедитесь, что вызов UIApplicationMain в main.m выглядит так:

 UIApplicationMain(argc, argv, nil, @"MyAppDelegateClassName");
  

вместо этого:

 UIApplicationMain(argc, argv, nil, nil);
  

2) Убедитесь, что Info.plist не имеет значения «MainWindow.xib» в качестве основного файла nib.

3) Программная загрузка UIWindow в делегате приложения.

Итак, нет, вам не нужно использовать MainWindow.xib и, на самом деле, вы никогда этого не делали. Вы всегда можете делать что-то программно.

Это хороший вопрос, почему Apple внесла это изменение в настройки Xcode по умолчанию, и я не знаю ответа. Но это может быть связано с производительностью или переходом на ARC или небольшие размеры файлов приложений или что-то еще в целом.

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

1. Можно ли указать пару плюсов и минусов? Я думаю, я пытаюсь выяснить, что было бы лучшим решением в отношении использования или неиспользования «MainWindow.xib».

2. Я думал об этом, и у меня на самом деле возникла проблема со слишком большим количеством плюсов. Я полагаю, это позволило вам настроить приложение на основе панели вкладок (или, возможно, навигационный контроллер) немного более визуально, поскольку вы могли управлять представлением контейнера в Interface Builder. Теперь, когда я создаю новое приложение панели вкладок с шаблоном, панель вкладок существует только в коде. Но поскольку по-прежнему легко создавать и использовать контроллеры просмотра с помощью Interface Builder, мне трудно думать, что многое было потеряно. Я бы, вероятно, продвигался вперед, не используя MainWindow.xib.

Ответ №2:

Я думаю, причина, по которой он сейчас отсутствует, заключается в том, что создание окна программно намного эффективнее, чем открытие файла xib и разархивирование объектов. Как правило, если вы можете сделать это в одной строке кода, вы должны сделать это в коде.

Прочитайте ответ Мэтью Гиллингема для получения инструкций о том, как вручную изменить старый проект, чтобы он работал без MainWindow.xib.

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

1. Итак, вы думаете, что просто обойти «MainWindow.xib» — это путь для всех будущих проектов?

2. Да, я всегда создаю окно программно для всех своих проектов, потому что, как вы знаете, первое, что появляется в окне, в любом случае управляется контроллером представления. Наличие xib только с окном и ничем другим не дает вам никаких преимуществ.

Ответ №3:

Я всегда чувствую смущение по поводу использования MainWindow.xib: даже с ним мне все равно нужно установить RootViewController window или addSubview к нему. Разве эта информация не содержится в MainWindow.xib? Почему мне все еще нужно сообщать window об этом?

Поэтому удаление MainWindow.xib, похоже, имеет смысл.