В случае универсального приложения необязательно иметь соотношение .xib к классу контроллера 2: 1. Вот схема, которой я следую:
У вас есть класс MainViewController. У вас есть 2 файла .xib: MainView-iPhone.xib и MainView-iPad.xib. Оба этих файла имеют выход «Владелец файла», установленный на MainViewController. Теперь, чтобы убедиться, что контроллер представления действительно загружает правильный интерфейс и подключает все нужные розетки в зависимости от устройства, на котором работает приложение, я сделаю что-то вроде следующего:
MainViewController* controller = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
controller = [[MainViewController alloc]initWithNibName:@"MainView-iPad" bundle:[NSBundle mainBundle]];
} else {
controller = [[MainViewController alloc] initWithNibName:@"MainView-iPhone" bundle:[NSBundle mainBundle]];
}
/* Present the controller */
Теперь я должен также сказать, что это хорошая идея, если не слишком много разных путей кода, которым необходимо следовать при запуске на разных устройствах. Если поведение контроллера более специализировано при работе на iPad и iPhone, то лучше выделить абстрактное поведение в MainViewController, а затем написать два подкласса: MainViewController_iPhone и MainViewController_iPad. Каждый подкласс затем загружает соответствующий файл .xib и обрабатывает все особенности внутри. В этом случае приведенный выше код будет выглядеть примерно так:
MainViewController* controller = nil;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
controller = [[MainViewController_iPad alloc] init];
} else {
controller = [[MainViewController_iPhone alloc] init];
}
/* Present the controller */