Для приложений Universal - iPhone + iPad - вы можете указать, что разные NIB загружаются на каждой платформе, либо на целевой информационной панели, либо добавив клавиши NSMainNibFile~ipad
и NSMainNibFile~iphone
к вашим Info.plist
. Кроме того, вы можете добавить MainWindow~ipad.xib
NIB к вашей цели, он будет загружен на iPad вместо MainWindow.xib
, основываясь на ключе NSMainNibFile
в Info.plist.
Если вам нужно больше контроля и настройки для универсального приложения, вы можете загрузить начальный NIB вручную. Шаблон проекта «Универсальный» содержит шаблон для этого метода, поэтому самый быстрый способ начать использовать эту технику - просто создать новый проект iOS с универсальным профилем.
В приведенных выше примерах Main NIB File
установлен в Info.plist
(целевые настройки), так что у вас уже будет загружен NIB при вызове делегата приложения. Обычно в этой настройке объект MyAppDelegate
также будет заархивирован в NIB (с некоторыми значениями IBOutlets
), а для NIB File's Owner
будет установлено значение UIApplication
.
Для универсального проекта, позволяющего разместить два альтернативных макета, ключ Main NIB File не указан в Info.plist
. Затем он программно создает экземпляр объекта-делегата приложения в UIApplicationMain
:
#import "MYAppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([MYAppDelegate class]));
}
}
Затем проверьте вашу среду и настройки и загрузите соответствующий NIB в application:DidFinishLaunchingWithOptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
_window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
_viewController = [[[MYViewController alloc] initWithNibName:@"MYViewController_iPhone" bundle:nil] autorelease];
} else {
_viewController = [[[MYViewController alloc] initWithNibName:@"MYViewController_iPad" bundle:nil] autorelease];
}
_window.rootViewController = _viewController;
[_window makeKeyAndVisible];
return YES;
}
- (void)dealloc {
[_window release];
[_viewController release];
[super dealloc];
}
Новый шаг - создать корень MYViewController
вручную, загрузив соответствующий NIB. В этой настройке File's Owner
- это ваш новый MYViewController
, а не UIApplication
. Если вы хотите, MYViewController
может принять большую часть того, для чего вы, возможно, использовали свой делегат приложения - который часто инкапсулирует базовый класс модели приложения, выступает в качестве источника данных и делегирует для представлений и других вещей в СИБ.
Таким образом, ожидается, что у вас есть корень UIView
в NIB, и он должен быть подключен к view
выходу File's Owner
(MYViewController
).
Обратите внимание, что NIB MYViewController фактически не загружается до тех пор, пока в первый раз не будет получен доступ к свойству MYViewController.view
. Только тогда [MyViewController viewDidLoad]
будет вызван! Наиболее вероятное время для этого - когда вы добавляете его в корневое окно.
В приведенном выше коде шаблона корень UIWindow
создается делегатом приложения, но нет никаких причин, по которым вы не могли бы вместо этого включить его в NIB. Если вы решите сделать это, будьте осторожны. Если вы установите rootViewController
окна в NIB для владельца файла в этом случае, это приведет к тому, что представление контроллера будет добавлено в окно, когда окно активировано. В любом случае будьте осторожны при создании первого NIB.
Делегат приложения не обязательно должен иметь ссылку на ваш корень UIWindow
, если вы хотите, чтобы MYViewController управлял им, но в целом может быть чище, чтобы держать корневое окно вне ваших NIB и управлять им в приложении делегировать.
За исключением этого (!), Он не сильно отличается от одноплатформенного подхода.