MacRuby + Interface Builder: как отобразить, затем закрыть, а затем снова отобразить окно

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

Вопрос

Я полный новичок в 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, а затем подключить оконный выход владельца файла к окну.

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

-

И последнее. Хотя это нормально делать что-то подобное в окне, вы можете в конечном итоге посмотреть, как это сделать с помощью листа, поскольку это предотвратит возможность скрытия окна добавления учетной записи за другими окнами.

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