Запуск приложения на основе какао-документов сначала показывает окно выбора

StackOverflow https://stackoverflow.com/questions/3903264

Вопрос

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

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

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

Не удалось подключить выборов ActionButton: для цели класса NSApplication

Он также отображает ошибку, что NSApplication не является соответствующим значением ключа для розетки, которое содержит ссылку на мой массив. Контроллер массива, окно и кнопки не связаны с NSApplication, а для нового контроллера окон. Я бы ожидал, что если бы какие-то проблемы не будет упоминать NSApplication, а скорее контроллер окон, к которому связаны контроллеры.

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

Любая помощь очень ценится. Ограбление

Это было полезно?

Решение

Настройка в IB для класса владельца файла NIB является только консультированием; Он позволяет IB показать только токи и действия, которые предоставляются экземплярами этого класса. Это не обеспечивает применение того, что владелец файла будет экземпляром этого класса, потому что владелец файла не является частью NIB.

Владелец файла является объектом, который загружает Nib. Это обязательно означает, что он за пределами Nib, и ничто в нибе не определяет ничего об этом. В случае NIB Mainmenu владелец его файла - объект, который загружает NIB Mainmenu, - это экземпляр NSApplication. Итак, все, что вы подключили к владельцу файла в своем пеле Mainmenu, вы подключились к объекту приложения, даже если вы сказали IB, что это не будет приложением.

Что приложение является владельцем Mainmenu Nib - независимо от того, что вы говорите IB-не ошибка. Приложение есть всегда владелец главной ниб. Это нормально и правильно; Вы не можете изменить его, не следует пытаться изменить его, и не нужно его менять.

Ошибка, в двух словах, состоит в том, что вы используете один NIB для двух совершенно разных целей.

Вы должны позволить Mainmenu Nib быть единственным - содержащим только MainMenu, ваш пользовательский контроллер документов (я доберусь до этого в данный момент), и ваш делегат приложения - и переместите окно предыдущих документов в отдельный NiB, принадлежащий Предыдущие документы окна контроллера. Для того, чтобы контроллер окон быть владельцем этого Nib, вам нужно загрузить его контроллер окна. Вы должны сделать это в коде - вы не можете установить это в IB или в Plist.

В делегате вашего приложения создается интенсированный и собственный контроллер окна. Похоже, вы сделали пользовательский подкласс NswindowController, чтобы вы могли переопределить его init чтобы он отправил себе initWithWindowNibName: сообщение для загрузки и владеть Nib. Тогда просто используйте alloc и init Чтобы создать контроллер окна из делегата приложения.

Это избавится от консольного сообщения и убедится, что кнопки фактически подключены к контроллеру окна (потому что они подключены к владельцу файла, что с этим изменением будет контроллером окон).

Ответьте свой делегат вашего приложения на applicationOpenUntitledFile: Отправляя окно контроллера showWindow: сообщение. Это заставит окно предыдущих документов появиться в любое время, когда пользователь обычно создал бы новый документ.

Если вы хотите поддержать обычные методы создания документов (т. Е. Разрешить работу нового документа), то реализуйте applicationDidFinishLaunching: и applicationShouldHandleReopen:hasVisibleWindows:, нет applicationOpenUntitledFile:. Анкет Убедитесь, что документы не открыты, и показать свое окно, если это так.

Вы также должны сделать пользовательский подкласс NSDocumentController и сделать контроллер документов экземпляром этого, и в этом классе реализовать addDocument: и removeDocument: Чтобы перекрасить окно предыдущих документов, когда последний открытый документ закрыт, и скрыть его при открытии документа.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top