MacRuby + Interface Builder: как отобразить, затем закрыть, а затем снова отобразить окно
-
27-10-2019 - |
Вопрос
Я полный новичок в MacRuby и Cocoa, поэтому имейте это в виду, отвечая - мне нужно много деталей и объяснений. :)
Я создал простой проект с двумя окнами, оба из которых созданы с помощью Interface Builder. Первое окно представляет собой простой список учетных записей в виде таблицы. Под таблицей есть кнопка «+». Когда я нажимаю кнопку +, я хочу показать окно «Добавить новую учетную запись».
У меня также есть классы AccountsController < NSWindowController
и AddNewAccountController < NSWindowController
, настроенные в качестве делегатов для этих окон, с подключенными соответствующими методами нажатия кнопок и выходами для ссылки на необходимые окна.
Когда я нажимаю кнопку "+" в окне "Учетные записи", возникает следующий код:
родовое словоэто отлично работает, когда я впервые нажимаю кнопку +. Все появляется, я могу ввести свои данные и привязать их к моей модели. однако, когда я закрываю форму добавления новой учетной записи, все становится плохо.
Если я установлю открытие окна добавления новой учетной записи при закрытии, то при втором нажатии кнопки «+» окно все равно будет всплывать, но оно заморожено. Я не могу нажимать кнопки, вводить данные или даже закрывать форму. Я предполагаю, что это связано с тем, что код формы был выпущен, поэтому нет цикла обработки сообщений, обрабатывающего форму ... но я не совсем уверен в этом.
Если я установил, чтобы окно добавления новой учетной записи не открывалось при закрытии, то при втором нажатии кнопки + окно отображается нормально и его можно использовать, но в нем все еще есть все данные, которые я ввел ранее. .. он все еще привязан к моему предыдущему экземпляру класса Account.
что я делаю не так? Как правильно создать новый экземпляр формы «Добавить новую учетную запись», создать новую модель учетной записи, привязать эту модель к форме и показать форму, когда я нажимаю кнопку «+» в форме учетных записей?
... все это делается на OSX 10.6.6, 64bit, с XCode 3.2.4
Решение
Проблема в том, что он не создает окно каждый раз. Отпускание при закрытии - это немного раздражающий вариант и обычно используется только в том случае, если вы знаете, что оконный контроллер также освобождается, когда окно закрывается. (Обратите внимание, я никогда не использовал MacRuby, поэтому я буду давать код в Obj-C, поскольку знаю, что он правильный, надеюсь, вы сможете его преобразовать. Я предполагаю, что GC включен, как и должно быть с MacRuby) / p>
Теперь это можно сделать двумя способами. Я не совсем уверен, как настроены ваши NIB / классы, так как это может быть одним из двух способов.
-
Первый способ решить эту проблему - использовать выходы, которые вы используете для ссылки на элементы формы, чтобы очистить их при повторном отображении окна, например [myTextField setStringValue: @ ""]. Если вы используете привязки какао, это немного сложнее, но в основном вы должны убедиться, что связанный объект отключен. Я бы порекомендовал отказаться от привязок, если вы новичок в Cocoa.
-
Второй способ - сделать класс AddNewAccountController подклассом NSWindowController. Когда вы нажимаете кнопку +, вы затем создаете новый экземпляр и отображаете его (не забудьте сохранить его в ivar). Лучше всего это сделать так:
родовое словоЭто предотвращает создание нового экземпляра, если окно уже отображается. Затем вам нужно реализовать делегат:
родовое словоОчевидно, вам нужно будет переместить окно в отдельный NIB под названием «AddNewAccountController». В этом NIB не забудьте установить для класса владельца файла значение AddNewAccountController, а затем подключить оконный выход владельца файла к окну.
Когда все это настроено, вы каждый раз будете получать новый контроллер / окно. Он также имеет то преимущество, что перья и контроллеры разделены на более узкие части.
-
И последнее. Хотя это нормально делать что-то подобное в окне, вы можете в конечном итоге посмотреть, как это сделать с помощью листа, поскольку это предотвратит возможность скрытия окна добавления учетной записи за другими окнами.