2011-11-26 13 views
6

Czy można utworzyć w pełni dostosowany alert? Robię to teraz z niestandardowymi arkuszami, ale chciałbym mieć funkcję, która blokuje arkusz (np. -[NSAlert runModal]).Tworzenie w pełni spersonalizowanego NSAlert

Chcę tylko zmienić tło, naprawdę i kolor tekstu, oczywiście.

+1

Technicznie nie jest nazywana arkuszem, jeśli działa sposób app-modalny. – JWWalker

+0

Alert app-modalny z niestandardowym tłem i kolorem tekstu brzmi, jakby był dość nieprzyjemny. Czy naprawdę * potrzebujesz * to zrobić? Czy przeczytałeś [Wytyczne dla Mac Human Interface] (http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/Intro/Intro.html)? –

+0

To wcale nie jest wredne. Alerty nie odpowiadają moim potrzebom, ponieważ pracuję z aplikacją pełnoekranową i używam 'NSStatusWindowLevel'. Czytałem te wytyczne jakiś czas temu, tak. – Fatso

Odpowiedz

5

Ostrzeżenie o zalecanym rozwiązaniem:

Ten kod powoduje marnotrawstwo i bezcelowe napowietrznych:

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

Kod ten jest kopiowany prosto ze strony dokumentacji firmy Apple - ale ma na celu pokazać programistce , w której można wstawić znaczący kod do wykonania w tle podczas działania modala. Oznacza to, że powinieneś mieć kod między przerwą a nawiasem zamykającym. Ale nie ma rzeczywistego kodu pokazanego w przykładzie - i uruchamianie go w ten sposób powoduje, że aplikacja wielokrotnie odpytuje sesję, aż się skończy. To jest jak dwulatek na tylnym siedzeniu samochodu na wycieczce z pytaniem "Czy jesteśmy tam jeszcze?" Czy jesteśmy tam jeszcze? Czy jesteśmy tam jeszcze? ... "

Jeśli chcesz tylko prosto modalne wykonanie, w którym aplikacja prezentuje okno modalne i wstrzymuje przetwarzanie głównych okien/t aż modalnych końcach, użyj tego:

[NSApp runModalForWindow: self.window]; 

... a potem zamknąć sesję modalne, gdy okno zamyka zrzucając to na Twoja podklasa kontrolera okiennego:

- (void)windowWillClose:(NSNotification *)notification { 
    [NSApp stopModal]; 
} 
+0

Okay David, dzięki za wyjaśnienie! – Fatso

3

Będziesz potrzebować niestandardowego okna z niestandardowym widokiem, jednak NSAlert nie pozwala zmienić jego okna. Więc będziesz musiał napisać własną podklasę kontrolera okien, taką jak NSAlert (chociaż NSAlert to podklasa NSObject).

2

Rozejrzałem się trochę i znalazł ten kawałek kodu:

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

Wzywam

[NSApp stopModal] 

aby zakończyć sesję. Teraz mój kod jest sposób czystszy :)