При запуске приложения на основе документов Какао сначала отображается окно выбора - PullRequest
7 голосов
/ 11 октября 2010

Кажется, это должно быть легко, но я, должно быть, что-то упустил.У меня есть приложение на основе документов.Я также создал новый XIB с NSTableView и тремя кнопками, которые я намерен отобразить в списке предыдущих файлов.Я хочу, чтобы эта XIB отображалась вместо окна документа при первом запуске приложения.Как только пользователь выбирает старый файл или нажимает кнопку «Новый», я хочу перейти в окно документа.Это очень распространенное явление, и я видел, что оно используется довольно часто.

В моих попытках добиться этого я изменил файл project-info.plist и изменил базовое имя файла основного NIB с MyDocument на мой Selection XIB.название.Это заставляет приложение отображать окно выбора вместо окна MyDocument.Кажется, до этого момента проблем не было.

В моем окне выбора я настроил мое табличное представление, контроллер массива и специальный оконный контроллер только для этой XIB.Я установил для владельца файла новый контроллер окна и привязал свойство окна контроллера окна к окну, а свойство делегата окна - к владельцу файла, а также к кнопкам «Выбрать», «Отмена» и «Новый».Ничто не связано с NSApplication.Но странно то, что когда я запускаю это приложение, кажется, что он хочет подключить эти контроллеры к NSApplication с ошибкой (то же самое для двух других кнопок):

Не удалось подключить действие selectButton: к цели класса NSApplication

Также отображается ошибка, что NSApplication не соответствует Key-Value для выхода, который содержит ссылку на мой массив.Контроллер массива, окно и кнопки связаны не с NSApplication, а с новым контроллером окна.Я ожидал бы, что, если бы была какая-либо проблема, НЕ упоминал бы NSApplication, а скорее контроллер окна, к которому привязаны контроллеры.

Кто-нибудь знает, что здесь происходит?Является ли это проблемой Target-Action, потому что я изменил «Основное имя основного файла NIB» с «Главное меню» на «Выбор»?Если я не должен изменять это, то как я могу заставить Какао позволить мне отображать экран выбора перед отображением окна документа?

Любая помощь очень ценится.Rob

1 Ответ

9 голосов
/ 11 октября 2010

Настройка в 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: для повторного отображения окна предыдущих документов при закрытии последнего открытого документа и скрытия его при открытии документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...