2011-11-26 10 views
6

È possibile creare un avviso completamente personalizzato? Lo sto facendo con i fogli personalizzati ora, ma mi piacerebbe avere la funzione che il foglio sta bloccando (come -[NSAlert runModal]).Creazione di NSAlert completamente personalizzato

Voglio solo cambiare lo sfondo, in realtà, e il colore del testo, ovviamente.

+1

Tecnicamente, non è chiamato un foglio se è in esecuzione in un modo mod-app. – JWWalker

+0

Un avviso modale app con sfondo personalizzato e colore del testo sembra essere piuttosto sgradevole. Hai davvero * bisogno * di fare questo? Hai letto [Mac Human Interface Guidelines] (http://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AppleHIGuidelines/Intro/Intro.html)? –

+0

Non è affatto cattivo, davvero. Gli avvisi non si adattano alle mie esigenze, dal momento che sto lavorando con un'applicazione a schermo intero e sto usando 'NSStatusWindowLevel'. Ho letto quelle linee guida qualche tempo fa, sì. – Fatso

risposta

5

avviso circa la soluzione consigliata:

Questo codice provoca uno spreco e inutile sovraccarico:

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

Questo codice viene copiato direttamente dalla pagina di documentazione di Apple - ma ha lo scopo di mostrare allo sviluppatore dove può essere inserito un codice significativo per l'esecuzione in background mentre il modale è in esecuzione. Cioè, dovresti avere del codice tra la pausa e la parentesi di chiusura. Ma non vi è alcun codice reale mostrato nell'esempio - e eseguirlo in questo modo fa sì che l'applicazione esegua il polling della sessione ripetutamente fino alla fine. È come il bambino di due anni sul sedile posteriore della macchina in un viaggio in cui si chiede: "Siamo già arrivati? Siamo ancora lì? Siamo già lì? ..."

Se vuoi semplicemente esecuzione modale, in cui l'applicazione presenta una finestra modale e sospende l'elaborazione di/sfondo finestre principali fino al termine modali, utilizzare questo:

[NSApp runModalForWindow: self.window]; 

... e poi uscire dalla sessione di modal quando la finestra si chiude facendo cadere questo in sottoclasse del controllore di finestre:

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

Ok, David, grazie per aver chiarito !! – Fatso

3

Avrete bisogno di una finestra personalizzata con il disegno di visualizzazione personalizzato, tuttavia NSAlert non consente di modificare la sua finestra. Quindi dovrai scrivere la sottoclasse del tuo controllore di finestre come NSAlert (anche se NSAlert è una sottoclasse di NSObject).

2

mi sono guardato intorno un po ', e abbiamo trovato questo pezzo di codice:

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

chiamo

[NSApp stopModal] 

per terminare la sessione. Ora il mio codice è modo più pulito :)