Подтвердить что ты не робот

Что такое File Owner (в интерфейсе)?

Я новичок в Cocoa, и я не понимаю понятия File Owner файла .nib.

Вот как я буду видеть вещи:

  • Рассмотрим файл myNibFile.nib, который описывает, как выглядит окно.

  • Теперь я хочу подключить фактическое окно к этому .nib файлу. Итак, я создаю класс myWindow, который является подклассом NSWindowController. И, чтобы сделать это соединение, я меняю метод init следующим образом:

         -(id)init
         {
             [super initWithWindowNibName:@"myNibFile"];
             return self;
         }
    

Итак, я понимаю, что когда я создаю экземпляр myWindow, "система" пойдет и посмотрит на .nib файл и создаст соответствующий объект.

Итак, мой вопрос:

  • Почему я должен указать, что File Owner моего .nib файла myWindow? Разве это не избыточно?

  • Я предполагаю, что это означает, что я действительно не понял, что это за File Owner. Что это? Почему файл .nib должен принадлежать чему-то? Разве это не "где-то" в моем "приложении", и когда это необходимо, "система" идет туда и использует его?

Спасибо, что помогли мне более четко увидеть эти новые концепции!

4b9b3361

Ответ 1

Следует помнить о двух моментах:

  • Владелец файла - это объект, который загружает nib, то есть тот объект, который получает сообщение loadNibNamed: или initWithNibName:.
  • Если вы хотите получить доступ к любым объектам в nib после его загрузки, вы можете установить выход в файле владельца.

Итак, вы создали причудливое представление с большим количеством кнопок, subviews и т.д. Если вы хотите изменить любое из этих представлений/объектов в любое время после загрузки nib FROM из загрузочного объекта (обычно это view или window controller), вы устанавливаете выходные данные для этих объектов владельцу файла. Это так просто.

По этой причине по умолчанию все контроллеры View или Window Controllers действуют как владельцы файлов, а также имеют выход к главному окну или объекту просмотра в файле nib: поскольку duh, если вы контролируете что-то, вы будете определенно нужно иметь выход к нему, чтобы вы могли отправлять ему сообщения.

Причина, по которой он называется владельцем файла и задан особым местом, заключается в том, что, в отличие от других объектов в nib, владелец файла является внешним по отношению к nib и не является его частью. Фактически, он становится доступным только при загрузке ниба. Таким образом, владелец файла является резервным или прокси-сервером для фактического объекта, который позже загрузит nib.

Надеюсь, вы поняли. Я проясню любой из пунктов, если вы спросите.

Ответ 2

Самое главное понять, что Interface Builder позволяет создавать объекты, которые автоматически связаны друг с другом, без каких-либо усилий со стороны вашей программы. Вы можете создавать экземпляры всех объектов, включая неотображаемые, и они могут быть взаимосвязаны; например, вы можете создать экземпляр источника данных представления таблицы вместе с самим представлением и т.д. Этот механизм обычно используется для создания делегата приложения в главном меню NIB.

Однако, поскольку все это выполняется с помощью drag & drop, кажется, что вы не можете создать соединение между любым из объектов NIB и объектами, которые уже существуют в вашем приложении, за одним исключением.

Когда код загружает файл NIB, у вас есть возможность указать ровно один объект, который NIB будет считать "владельцем файлов". Это местозаполнитель, который вы видите внутри Interface Builder; поскольку он может представлять любой объект в вашем приложении, Interface Builder не может знать, какие действия/выходы доступны на нем. Вот почему вы можете изменить "класс" владельца файлов на вкладке "Атрибуты".

Владелец файлов на самом деле не представляет собой "собственность" или "родительство". То, что он представляет, - это "объект, который загрузил этот NIB".

Ответ 3

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

Ответ 4

Владелец файла в Interface Builder - это то, что он знает тип объекта родителя. Это используется двумя способами. Во-первых, в Interface Builder, чтобы IB знал, какие выходы и действия доступны вам для подключения. Во-вторых, он используется инфраструктурой приложения, чтобы знать, как повторно подключать вещи к остальной части вашего кода после загрузки файла nib.