Инициализация подкласса NSWindowController от пера не использует -initWithCoder :? - PullRequest
4 голосов
/ 15 августа 2010

Я добавил пользовательский подкласс NSWindowController в свой проект Cocoa и добавил экземпляр моего подкласса в перо моего приложения.Я ожидал увидеть переопределение -initWithCoder: метод, вызываемый при загрузке пера, но это не так.Для отладки я добавил обычный метод -init и установил на нем точку останова - и, конечно же, я достиг точки останова при загрузке пера.

Это может на самом деле упростить некоторые вещи для меня (например, установка windowNibName)но я не понимаю, почему Какао ведет себя так.Вся документация, которую я прочитал, предполагает, что -initWithCoder: это то место, где я должен переопределять.Почему этот случай отличается?

Ответы [ 3 ]

4 голосов
/ 16 августа 2010

Я предполагаю, что для создания экземпляра вашего оконного контроллера в Интерфейсном Разработчике вы перетащили общий экземпляр NSObject в файл nib, а затем присвоили свой пользовательский подкласс NSWindowController в качестве класса объекта, это правильно?Если так, то я думаю, что их ключевое отличие в том, что вы имеете дело с созданием экземпляра универсального объекта, а не пользовательского объекта, включенного в одну из палитр IB.

Большую часть времени, когда вы создаете ипри настройке объекта с использованием IB параметры, указанные вами в различных инспекторах, кодируются с использованием метода encodeWithCoder: при сохранении файла пера.Когда вы затем загружаете этот nib-файл в свое приложение, эти объекты инициализируются с использованием метода initWithCoder:.

Однако в случае этого экземпляра универсального объекта Interface Builder не обязательно ничего знает о классеобъекта, который создаетсяПоскольку вы можете указать любое имя класса для создания экземпляра, если вы укажете класс, который IB не загрузил через палитру или структуру, он не сможет сериализовать этот объект, используя NSCoding.Поэтому я считаю, что когда вы создаете экземпляр такого общего объекта, он инициализируется с использованием init, а не initWithCoder:, потому что он не был сохранен с использованием encodeWithCoder: в первую очередь при сохранении файла пера.

Я не знаю, документировано ли это где-либо, но я думаю, именно поэтому вы видите разницу там.Я также не думаю, что он специфичен для NSWindowController, но вы скорее всего увидите такое же поведение для любого объекта, экземпляра которого является общий NSObject в IB, независимо от конкретного класса.

0 голосов
/ 16 августа 2010

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

То, что вы здесь делаете, отличается.Вы встраиваете свой класс контроллера в свой исполняемый файл.Это означает, что нет необходимости читать сам класс из файла, поскольку он является частью исполняемого двоичного файла приложения.

При использовании этого класса контроллера вам необходимо предоставить метод init, в котором вы указываете имя файла пера.Зачем?Ну, у вас есть скомпилированный класс как часть вашего exe, но вы не знаете, что такое nib-файл.Вот как вы предоставляете эти знания.

Подумайте об этом так.Ваш контроллер класса является частью exe.Необходимо сделать некоторую связь между ним и файлом nib.Одним из способов может быть просмотр всех файлов пера в поисках ссылок на этот контроллер.Это было бы неэффективно.Введите имя в init и загрузите все.

Другими словами, вы извлекли некоторые важные уроки из своих экспериментов.Молодец, будучи таким наблюдательным.

0 голосов
/ 16 августа 2010

У меня до сих пор нет официального ответа , почему Какао ведет себя так, но при практическом использовании это кажется удобным. Я определил подкласс NSWindowController с помощью следующего метода -init, и он работает как шарм.

- (id)init;
{
    if ((self = [super initWithWindowNibName:@"MumbleMumbleSheet"]) != nil) {
        …
    }
    return self;
}

Если бы вызывался -initWithCoder: мне нужно было бы выяснить, как выполнить неявное обязательство вызвать метод super -initWithCoder: и все же получить правильное -windowNibName, используемое для загрузки. Так гораздо проще.

Я все равно был бы признателен за указатель на некоторую документацию, которая говорит , этот класс отличается и объясняет, почему и как ... Но в отсутствие документации есть эмпирические доказательства.

...