Как связать файл .xib с файлом класса с помощью Xcode 4 - PullRequest
28 голосов
/ 20 мая 2011

запустили универсальный проект под новым Xcode4.Мое приложение работает как на устройствах iPhone и iPad, но не очень хорошо подходит для iPad.У меня есть 2 .xib файла для MainWindow: MainWindow.xib (устройство iPhone) и MainWindow-Ipad.xib (устройство iPad).Но только один файл .xib для моего MainView: MainView.xib.

Поэтому я пытаюсь создать специальный файл .xib для устройства iPad:

Новый файл> Пользовательский интерфейс> Просмотр-> следующее -> семейство устройств: iPad -> MainView-iPad.xib -> save

И, конечно, ничего не подключено, нет ссылки на розетку, нет ссылки на какой-либо класс.

Я проверяю каждый эскиз моего нового MainView-iPad.xib, чтобы безуспешно связать его с моим классом MainViewController!?

Где или как я могу связать его с моим классом MainViewController?Заранее спасибо.

Ответы [ 4 ]

91 голосов
/ 07 февраля 2012

Правильный ответ дал пользователь763308:

Чтобы связать .xib с классом в Xcode4:

  1. Откройте .xib.
  2. В качестве заполнителя: выберите владельца файла.
  3. На третьем миниатюре: «Identity Inspector» на правой панели, отредактируйте поле «Custom Class» и введите имя вашего класса.

Мне тоже тогда пришлось:

  1. Щелкните по корневому представлению под Объектами.
  2. Щелкните последнюю вкладку: «Показать соединения».
  3. Перетащите «Новый источник ссылок» на «Владелец файла» и выберите «Вид».
4 голосов
/ 20 мая 2011

Вы хотите создать новый подкласс UIViewController, а не новый файл пользовательского интерфейса.Это создаст ваш .xib, а также файлы классов (.m и .h).Шаблон находится под Cocoa Touch.

Желание связать с существующим контроллером представления, вероятно, не очень хорошая идея.Если вы следуете шаблону проектирования MVC (Model-View-Controller), у вас есть отдельные классы данных и контроллеры представления.Если вы можете, переместите вещи из вашего класса MainViewController в класс данных, которым он владеет.Затем создайте еще один контроллер представления для iPad и присвойте ему экземпляр созданного вами класса данных.

1 голос
/ 18 марта 2013

Чтобы связать .xib с файлом класса, вы можете сделать следующие шаги: -

1) перейти на вид справа. 2) нажмите на третью кнопку, и у вас появится строка с вопросом о кастоме class der Вы просто пишете имя файла класса, который хотите связать.

для создания ссылочных точек: -

1) вы можете скопировать все розетки из iPhone .xib и вставить его сюда, а затем перетащить все розетки в владелец файла и затем подключить их.

1 голос
/ 23 мая 2011

В случае универсального приложения необязательно иметь соотношение .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 */
...