Создание полностью настроенного NSAlert - PullRequest
6 голосов
/ 26 ноября 2011

Можно ли создать полностью настроенное оповещение?Сейчас я делаю это с пользовательскими листами, но мне бы хотелось иметь функцию, которая блокирует лист (например, -[NSAlert runModal]).

Я просто хочу изменить фон, и текстцвет, конечно.

Ответы [ 3 ]

6 голосов
/ 18 августа 2012

Предупреждение о рекомендуемом решении:

Этот код приводит к расточительным и бессмысленным накладным расходам:

for (;;) {
    if ([NSApp runModalSession:session] != NSRunContinuesResponse)
        break;
}

Этот код скопирован прямо со страницы документации Apple - ноон предназначен для того, чтобы показать разработчику , где можно вставить значимый код для фонового выполнения во время работы модального режима.То есть, между пробелом и закрывающей скобкой должен быть какой-то код.Но в примере не показан реальный код - и запуск его таким образом просто заставляет ваше приложение многократно опрашивать сеанс до его завершения.Это как двухлетний ребенок на заднем сиденье машины в автомобильной поездке, спрашивающий: «Мы уже здесь? Мы еще там? Мы там еще? ...»

Если вы простохотите простого модального исполнения, когда ваше приложение представляет модальное окно и приостанавливает обработку главного / фонового окон до завершения модального режима, используйте это:

[NSApp runModalForWindow: self.window];

... и затем выходите из модального сеанса, когда окно закрываетсяопустив это в ваш подкласс контроллера окна:

- (void)windowWillClose:(NSNotification *)notification {
    [NSApp stopModal];
}
3 голосов
/ 26 ноября 2011

Вам понадобится пользовательское окно с пользовательским чертежом вида, однако NSAlert не позволяет вам изменять его окно.Поэтому вам нужно написать собственный подкласс оконного контроллера, например NSAlert (хотя NSAlert - это подкласс NSObject).

2 голосов
/ 26 ноября 2011

Я немного огляделся и нашел этот фрагмент кода:

NSModalSession session = [NSApp beginModalSessionForWindow:sheetWindow];
for (;;) {
    if ([NSApp runModalSession:session] != NSRunContinuesResponse)
        break;
}
[NSApp endModalSession:session];

Я звоню

[NSApp stopModal]

, чтобы завершить сеанс.Теперь мой код стал чище:)

...