MacRuby + Interface Builder: как отобразить, затем закрыть, затем снова отобразить окно - PullRequest
3 голосов
/ 30 января 2011

Я полный n00b с MacRuby и Cocoa, так что имейте это в виду при ответе - мне нужно много деталей и объяснений.:)

Я создал простой проект с двумя окнами, оба из которых построены с помощью Interface Builder.Первое окно представляет собой простой список учетных записей с использованием табличного представления.Он имеет кнопку «+» под таблицей.Когда я нажимаю кнопку +, я хочу показать окно «Добавить новую учетную запись».

У меня также есть классы AccountsController < NSWindowController и AddNewAccountController < NSWindowController, настроенные в качестве делегатов для этих окон, сподключены соответствующие методы нажатия кнопок и розетки для ссылки на необходимые окна.

Когда я нажимаю кнопку «+» в окне «Учетные записи», у меня срабатывает следующий код:

    @add_account.center
    @add_account.display
    @add_account.makeKeyAndOrderFront(nil)
    @add_account.orderFrontRegardless

thisотлично работает в первый раз, когда я нажимаю кнопку +.Все отображается, я могу ввести свои данные и связать их с моей моделью.однако, когда я закрываю форму добавления новой учетной записи, все начинает ухудшаться.

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

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

что я делаю не так?Как правильно создать новый экземпляр формы «Добавить новую учетную запись», создать новую модель учетной записи, связать эту модель с формой и показать форму, когда я нажимаю кнопку «+» в форме «Учетные записи»?

... все это делается на OSX 10.6.6, 64-битной, с XCode 3.2.4

1 Ответ

1 голос
/ 30 января 2011

Проблема в том, что он не создает окно каждый раз. Отпускание при закрытии - это немного раздражающая опция, и обычно она используется только в том случае, если вы знаете, что оконный контроллер также освобождается при закрытии окна. (Обратите внимание, что я никогда не использовал MacRuby, поэтому я буду давать код в Obj-C, поскольку я знаю, что он правильный, надеюсь, вы сможете преобразовать его. Я буду считать, что GC включен, как и должно быть в MacRuby).

Теперь есть два способа сделать это. Я не совсем уверен, как настроены ваши NIB / классы, так как это может быть одним из двух способов.

-

Первый способ решить эту проблему - использовать выходы, которые вы используете для ссылки на элементы формы, чтобы очистить их при повторном отображении окна, например [myTextField setStringValue: @ ""]. Если вы используете привязки какао, то это немного сложнее, но в основном вы должны убедиться, что связанный объект скрыт. Я бы рекомендовал против привязок, если вы новичок в Какао.

-

Второй способ - сделать класс AddNewAccountController подклассом NSWindowController. Когда вы нажмете кнопку +, вы создадите новый экземпляр и отобразите его (не забудьте сохранить его в ivar). Лучший способ сделать это будет так:

if (!addAccountController) {
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"];
    [[addAccountController window] setDelegate:self];
}
[addAccountController showWindow:self];

Это предотвращает создание нового экземпляра, если окно уже видно. Затем вам нужно реализовать делегат:

- (void)windowWillClose:(NSNotification *)notification {
    //If you don't create the account in the AddNewAccountController then do it here
    addAccountController = nil;
}

Очевидно, вам необходимо переместить окно в отдельный NIB с именем «AddNewAccountController». В этом NIB убедитесь, что для класса «Владелец файла» задано значение «AddNewAccountController», а затем для подключения окна «Владелец файла» к окну.

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

-

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

...