Настройка в IB для класса владельца файла пера носит рекомендательный характер;он позволяет IB показывать только те розетки и действия, которые предоставляются экземплярами этого класса.Это не означает, что Владелец файла будет экземпляром этого класса, потому что Владелец файла не является частью пера.
Владельцем файла является объект, который загружает перо. Это обязательно означает, что он находится за пределами пера, и ничего в нем не определяет ничего о нем. В случае пера MainMenu его владельцем файла - объектом, который загружает перо MainMenu - является NSApplication.пример.Итак, все, что вы подключили к Владельцу файла в своем пике MainMenu, вы подключили к объекту приложения, даже если вы сказали IB, что это не будет приложение.
То, что приложение является владельцемперо MainMenu - независимо от того, что вы говорите IB - не является ошибкой.Приложение всегда является владельцем пера MainMenu.Это нормально и правильно;Вы не можете изменить его, не должны пытаться изменить его, и не нужно менять его.
В двух словах, ошибка в том, что вы используете один кончик для двух совершенно разных целей.
Вам следует оставить перо MainMenu в одиночестве, содержащее только MainMenu, ваш пользовательский контроллер документов (я скоро к этому вернусь) и делегата приложения, и переместить окно предыдущих документов в отдельный перо., принадлежащий контроллеру предыдущих документов.Чтобы оконный контроллер был владельцем этого пера, необходимо, чтобы оконный контроллер загрузил его.Вы должны сделать это в коде - вы не можете установить это в IB или в plist.
В делегате вашего приложения создайте экземпляр контроллера окна и владейте им.Похоже, вы создали собственный подкласс NSWindowController, поэтому вы можете переопределить его init
, чтобы он отправил себе сообщение initWithWindowNibName:
для загрузки и владения пера.Затем просто используйте alloc
и init
для создания контроллера окна из делегата приложения.
Это избавит от сообщения консоли и обеспечит подключение кнопок к контроллеру окна (потому что они подключены к владельцу файла, который, с этим изменением, будет контроллером окна).
Попросите вашего приложения делегата ответить на applicationOpenUntitledFile:
, отправив контроллеру окна сообщение showWindow:
.Это заставит окно предыдущих документов появляться каждый раз, когда пользователь обычно создал бы новый документ.
Если вы хотите поддерживать обычные методы создания документов (т. Е. Разрешить работу Нового документа), то реализуйтеapplicationDidFinishLaunching:
и applicationShouldHandleReopen:hasVisibleWindows:
, а не applicationOpenUntitledFile:
.Убедитесь, что документы не открыты, и покажите свое окно, если это так.
Вы также должны создать собственный подкласс NSDocumentController и сделать экземпляр этого документа своим контроллером документов, а в этом классе реализовать addDocument:
и removeDocument:
для повторного отображения окна предыдущих документов при закрытии последнего открытого документа и скрытия его при открытии документа.