Как nib-файл знает, что его контролер владельца файла - PullRequest
2 голосов
/ 15 апреля 2011

Когда создается UIViewController и соответствующий файл пера, этот файл пера обычно имеет то же имя, что и контроллер, но его можно переименовать.Итак, как IB узнает, к какому UIViewController относится этот nib-файл?

При перетаскивании из ссылочной розетки или из действия IB показывает только методы для конкретного контроллера.Как это выбрано?Когда кто-то переименовывает перо, мне интересно, сохраняет ли IB связь между пером и UIViewController.

Кажется ли, что в моей голове слишком много путаницы?:) Надеюсь, что нет ...

С уважением, Фак

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Файл пера не обязательно должен знать, какой конкретный подкласс UIViewController является владельцем его файла. Обратите внимание, что загрузка пера view, принадлежащего контроллеру, (обычно) выполняется в два этапа:

  1. Создается экземпляр (подкласс) UIViewController
  2. Этот экземпляр получает -initWithNibName:bundle:, поэтому ему известно о файле пера, который он должен загрузить, после чего экземпляр становится владельцем файла пера.

Таким образом, именно экземпляр UIViewController (или его подкласс) должен знать имя файла пера, но обратное утверждение не обязательно верно.

Тем не менее, подкласс UIViewController обычно определяет выходы для объектов в файле пера и получает действия. Для того, чтобы выходы и действия были связаны в Xcode / Interface Builder, вы устанавливаете класс владельца файла в инспекторе идентичности к соответствующему подклассу UIViewController.

3 голосов
/ 15 апреля 2011

Если открыть IB и проверить класс владельца файла на четвертой вкладке в окне инспектора, то здесь вы можете увидеть имя класса. enter image description here

1 голос
/ 22 апреля 2016

Я знаю, что это старый вопрос. Просто поделитесь моим пониманием здесь.

Допустим, мы создаем подкласс UIViewController в XCode и назовем его SecondViewController, имя файла xib которого по умолчанию будет SecondViewController.xib. Тогда давайте сначала посмотрим, как создать этот VC, а затем обсудим, кто является владельцем файла.

  1. Создание и отображение SecondViewController с именем пера: давайте создадим VC, используя initWithNibName: bundle: с указанным именем xib, код может выглядеть следующим образом:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  2. Создание и отображение SecondViewController без имени пера: если все по умолчанию, это означает, что VC имеет то же имя класса, что и имя файла xib, тогда мы можем игнорировать имя пера, коды, создающие vc, могут быть как это:

    SecondViewController * vc = [[SecondViewtController alloc] init];
    [self presentViewController:vc animated:YES completion:nil];
    
  3. Создайте и покажите SecondViewController с другим именем файла xib: если вы переименуете имя файла xib, то при создании VC вы должны указать имя файла xib, коды могут быть такими:

    SecondViewController * vc = [[SecondViewController alloc] initWithNibName:@"SecondViewController2" bundle:nil];
    [self presentViewController:vc animated:YES completion:nil];
    
  4. Что такое владелец файла? Во-первых, как говорит Apple, это объект-заполнитель. Этот объект является контейнером объектов, определенных в файле xib. Кроме того, этот объект может получать сообщения, отправленные объектами в xib, например, сообщение о нажатии кнопки. Когда вы создаете розетку или действие, их целью будет владелец файла, но этот объект неизвестен во время разработки. В конструкторе интерфейсов это выглядит так: File's Owner as the target of the action

  5. Кто владелец файла? Во-вторых, это имя класса, показанное в конструкторе интерфейса. Экземпляр этого класса содержит объекты, определенные в xib. Это показано так: enter image description here

  6. Что если я не установлю имя класса для владельца файла? В этом случае IB не позволит вам создать розетку или действие с помощью перетаскивания, поскольку оно не знает, кто будет содержать розетку или действие.

  7. Что если я удалю имя класса для владельца файла после создания выхода или действия? Можно удалить имя класса в IB. Вы создаете коды, как и раньше.

  8. Давайте вернемся к вопросу: «Как файл пера узнает, что его контроллер владельца файла»?

    • Во время разработки IB знает контроллер Владельца только после установки имени класса Владельца Файла;
    • Во время выполнения среда выполнения устанавливает объект, который получает init или initWithNibName: bundle: в качестве объекта-владельца файла пера.
...