IPB     Il futuro di Tevac dipende da te!  

Benvenuto Visitatore ( Log In | Registrati )

  · · · · · · · · · · · ·
Reply to this topicStart new topic
> [cocoa] chiarimento su Sheets modali
marg
messaggio 23 Feb 2008, 10:25
Messaggio #1


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



ciao a tutti e scusate se vi assillo con domande banali...

Vorrei fare in modo di leggere il contenuto di una NSTextField contenuta in una NSWindow, SOLO QUANDO l'utente preme il bottone OK.
Per fare ciò sto cercando di utilizzare una sheet.
Ho quindi 2 classi: MRMainController (che funge da controllore per la finestra principale)
e MRInputBoxController (che funge da controllore per la finestra "di input")

il problema è che non riesco a fare in modo che la sheet sia "modale".
Se nel metodo che visualizza la sheet scrivo:

CODICE
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
        modalDelegate:self didEndSelector:NULL contextInfo:nil];
    
NSRunAlertPanel(@"prova",[inputText stringValue] ,@"OK",nil,nil);


dove "inputWindow" è l'outlet che punta alla sheet e "inputText" è l'outlet che punta alla NSTextField,
il messaggio viene visualizzato immediatamente dopo l'apertura della sheet, e non dopo che essa viene chiusa.

grazie anticipatamente

Marcello
Go to the top of the page
 
+Quote Post
EnErGy
messaggio 23 Feb 2008, 11:01
Messaggio #2


Level 3/11
***

Gruppo: Forum User +
Messaggi: 224
Iscritto il: 1-September 04
Da: Lugano - Svizzera
Utente Nr.: 2.259



Per fare che il messaggio appaia dopo la chiusura dello sheet devi, ad esempio, creare un bottone "Ok" nello sheet e un'azione tipo questa:
CODICE
- (IBAction):chiudiSheet:(id)sender
{
[NSApp endSheet:inputWindow];
[inputWindow orderOut:nil];

NSRunAlertPanel(@"prova",[inputText stringValue] ,@"OK",nil,nil);
}


--------------------
Go to the top of the page
 
+Quote Post
marg
messaggio 23 Feb 2008, 11:14
Messaggio #3


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(EnErGy @ 23 Feb 2008, 11:01) *
Per fare che il messaggio appaia dopo la chiusura dello sheet devi, ad esempio, creare un bottone "Ok" nello sheet e un'azione tipo questa:
CODICE
- (IBAction):chiudiSheet:(id)sender
{
[NSApp endSheet:inputWindow];
[inputWindow orderOut:nil];

NSRunAlertPanel(@"prova",[inputText stringValue] ,@"OK",nil,nil);
}


Naturalmente avevo già creato il bottone OK per terminare lo sheet.
Il codice era solo un esempio per far capire che l'esecuzione del programma prosegue anche dopo aver visualizzato lo sheet "modale" (e quindi visualizza il messaggio che sta nella classe chiamante), mentre io vorrei che l'esecuzione del codice della classe chiamante rimanesse "sospesa" fino a quando lo sheet viene chiuso.
Infatti io vorrei leggere il valore della TextField dalla classe chiamante DOPO che lo sheet viene chiuso.

spero di essemi spiegato

grazie comunque

Marcello
Go to the top of the page
 
+Quote Post
marg
messaggio 23 Feb 2008, 11:31
Messaggio #4


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(marg @ 23 Feb 2008, 10:25) *
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
modalDelegate:self didEndSelector:NULL contextInfo:nil];

NSRunAlertPanel(@"prova",[inputText stringValue] ,@"OK",nil,nil);


Tanto per chiarire: se sostituisco la beginSheet con

CODICE
int retCode;
retCode = [NSApp runModalForWindow:inputWindow];


il messaggio viene visualizzato correttamente dopo che ho premuto OK, solo che non viene visualizzato uno sheet (che è più figo....) ma una finestra normale
Go to the top of the page
 
+Quote Post
marg
messaggio 23 Feb 2008, 17:36
Messaggio #5


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(marg @ 23 Feb 2008, 11:31) *
CITAZIONE(marg @ 23 Feb 2008, 10:25) *
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
modalDelegate:self didEndSelector:NULL contextInfo:nil];

NSRunAlertPanel(@"prova",[inputText stringValue] ,@"OK",nil,nil);


Tanto per chiarire: se sostituisco la beginSheet con

int retCode;
retCode = [NSApp runModalForWindow:inputWindow];

il messaggio viene visualizzato correttamente dopo che ho premuto OK, solo che non viene visualizzato uno sheet (che è più figo....) ma una finestra normale


Ok, ho risolto. Era anche piuttosto ovvio.....basta utilizzare insieme i metodi.

quindi:

CODICE
// VISUALIZZA LO SHEET
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
        modalDelegate:self didEndSelector:NULL contextInfo:nil];

//RENDE LO SHEET MODALE
retCode = [NSApp runModalForWindow:inputWindow];

[NSApp endSheet:connectionPanel];
    
/* VISUALIZZA UN MESSAGGIO CON IL TESTO DIGITATO NELLO SHEET
   QUANDO LO SHEET VIENE CHIUSO */
NSRunAlertPanel(@"TITOLO",[inputText stringValue],@"OK",nil,nil);



Marcello
Go to the top of the page
 
+Quote Post
Cpu86
messaggio 24 Feb 2008, 17:29
Messaggio #6


Level 3/11
***

Gruppo: Forum User +
Messaggi: 206
Iscritto il: 24-August 06
Da: Varese
Utente Nr.: 6.539



CITAZIONE(marg @ 23 Feb 2008, 17:36) *
// VISUALIZZA LO SHEET
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
modalDelegate:self didEndSelector:NULL contextInfo:nil];


Quando viene eseguito questo codice parte la finestra modale con il suo "run loop". Quest'istruzione torna subito al chiamante.
Come parametro didEndSelector: devi passare il metodo della classe delegata, in questo caso self, che verra' invocato quando la finestra modale verra chiusa (orderOut:).

Cpu86


--------------------
L'informatica non riguarda i computer più di quanto l'astronomia riguardi i telescopi. (Edsger Wybe Dijkstra)

« Tra molto tempo- per esempio tra diecimila anni- non c'è dubbio che la scoperta delle equazioni di Maxwell sarà giudicato l'evento più significativo del XIX secolo. La guerra civile americana apparirà insignificante e provinciale se paragonata a questo importante evento scientifico della medesima decade. »
(Richard Feynman)
Go to the top of the page
 
+Quote Post
marg
messaggio 24 Feb 2008, 21:44
Messaggio #7


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(Cpu86 @ 24 Feb 2008, 17:29) *
CITAZIONE(marg @ 23 Feb 2008, 17:36) *
// VISUALIZZA LO SHEET
[NSApp beginSheet:inputWindow modalForWindow:[NSApp mainWindow]
modalDelegate:self didEndSelector:NULL contextInfo:nil];


Quando viene eseguito questo codice parte la finestra modale con il suo "run loop". Quest'istruzione torna subito al chiamante.
Come parametro didEndSelector: devi passare il metodo della classe delegata, in questo caso self, che verra' invocato quando la finestra modale verra chiusa (orderOut:).

Cpu86


Ah! Ora provo.
Grazie del chiarimento


Marcello
Go to the top of the page
 
+Quote Post
marg
messaggio 24 Feb 2008, 22:15
Messaggio #8


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



Ho fatto come dici, ma il messaggio non viene visualizzato.... sicuramente mi sfugge qualcosa di elementare.
Il codice della classe chiamante è questo:

CODICE
- (IBAction)openPanel:(id)sender {

    [NSApp beginSheet:inputPanel modalForWindow:[NSApp mainWindow]
    modalDelegate:self didEndSelector:@selector(sheetDidEnd:) contextInfo:nil];
    
}

- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
    NSRunAlertPanel(@"TITOLO",@"PROVA MESSAGGIO",@"OK",nil,nil);
}

il codice del metodo di chiusura nella classe controllore del pannello è questo:

- (IBAction)closePanel:(id)sender
{

    id aWindow = [sender window];
    [aWindow orderOut:nil];
    [NSApp endSheet:aWindow];

}



Ne approfitto per fare un'altra domanda:
in Tiger (Xcode 2) se nel file nib ho 2 NSWindow, all'avvio dell'applicazione si apre solo quella principale e l'altra la posso visualizzare come sheet quando voglio io. In Leopard (Xcode 3) se ci sono 2 NSWindow nel nib, vengono visualizzate tutte e 2 all'avvio! non sono riuscito a trovare il modo di farne vedere solo una....

grazie anticipatamente

Marcello
Go to the top of the page
 
+Quote Post
Cpu86
messaggio 25 Feb 2008, 11:11
Messaggio #9


Level 3/11
***

Gruppo: Forum User +
Messaggi: 206
Iscritto il: 24-August 06
Da: Varese
Utente Nr.: 6.539



CITAZIONE(marg @ 24 Feb 2008, 22:15) *
Ho fatto come dici, ma il messaggio non viene visualizzato.... sicuramente mi sfugge qualcosa di elementare.
Il codice della classe chiamante è questo:

CODICE
- (IBAction)openPanel:(id)sender {

    [NSApp beginSheet:inputPanel modalForWindow:[NSApp mainWindow]
    modalDelegate:self didEndSelector:@selector(sheetDidEnd:) contextInfo:nil];
    
}

- (void)sheetDidEnd:(NSWindow *)sheet returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
    NSRunAlertPanel(@"TITOLO",@"PROVA MESSAGGIO",@"OK",nil,nil);
}

il codice del metodo di chiusura nella classe controllore del pannello è questo:

- (IBAction)closePanel:(id)sender
{

    id aWindow = [sender window];
    [aWindow orderOut:nil];
    [NSApp endSheet:aWindow];

}


Per forza, tu gli hai detto che hai un metodo chiamato "sheetDidEnd:", peccato che invece ne hai uno chiamato sheetDidEnd:returnCode:contextInfo:, quindi @selector(sheetDidEnd:returnCode:contextInfo:)


CITAZIONE(marg @ 24 Feb 2008, 22:15) *
Ne approfitto per fare un'altra domanda:
in Tiger (Xcode 2) se nel file nib ho 2 NSWindow, all'avvio dell'applicazione si apre solo quella principale e l'altra la posso visualizzare come sheet quando voglio io. In Leopard (Xcode 3) se ci sono 2 NSWindow nel nib, vengono visualizzate tutte e 2 all'avvio! non sono riuscito a trovare il modo di farne vedere solo una....

grazie anticipatamente

Marcello


Mai usato IB di Leopard, non e' che tra le preferenze c'e' qualcosa come "show at launch time"?

Cpu86


--------------------
L'informatica non riguarda i computer più di quanto l'astronomia riguardi i telescopi. (Edsger Wybe Dijkstra)

« Tra molto tempo- per esempio tra diecimila anni- non c'è dubbio che la scoperta delle equazioni di Maxwell sarà giudicato l'evento più significativo del XIX secolo. La guerra civile americana apparirà insignificante e provinciale se paragonata a questo importante evento scientifico della medesima decade. »
(Richard Feynman)
Go to the top of the page
 
+Quote Post
marg
messaggio 25 Feb 2008, 12:00
Messaggio #10


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(Cpu86 @ 25 Feb 2008, 11:11) *
Mai usato IB di Leopard, non e' che tra le preferenze c'e' qualcosa come "show at launch time"?

Cpu86



Ecco appunto... ero sicuro di aver commesso un errore da fesso....
Per quanto riguarda IB di Leopard ho controllato tutti i flag che possono a mio parere influenzare la visualizzazione della finestra all'avvio, ma senza risultato. Ora sono sul macbook e ho tiger, stasera a casa riproverò a ripassare tutte le opzioni su Leopard.

Ti ringrazio moltissimo per la disponibilità.

ciao

Marcello

Messaggio modificato da poweruser il 25 Feb 2008, 20:14
Motivo della modifica: Accorciato il quoting
Go to the top of the page
 
+Quote Post
marg
messaggio 25 Feb 2008, 21:10
Messaggio #11


Level 1/11
*

Gruppo: Forum User
Messaggi: 15
Iscritto il: 6-February 08
Utente Nr.: 9.619



CITAZIONE(marg @ 25 Feb 2008, 12:00) *
CITAZIONE(Cpu86 @ 25 Feb 2008, 11:11) *
Mai usato IB di Leopard, non e' che tra le preferenze c'e' qualcosa come "show at launch time"?

Cpu86



Ecco appunto... ero sicuro di aver commesso un errore da fesso....
Per quanto riguarda IB di Leopard ho controllato tutti i flag che possono a mio parere influenzare la visualizzazione della finestra all'avvio, ma senza risultato. Ora sono sul macbook e ho tiger, stasera a casa riproverò a ripassare tutte le opzioni su Leopard.

Ti ringrazio moltissimo per la disponibilità.

ciao

Marcello


Non so cosa mi sta succedendo.... sarò stressato dal lavoro..... icon_neutral.gif
Ho passato la serata alla ricerca di un maledetto flag che alla fine era proprio lì che mi guardava ridendo di me.....

semplicemente: Visible at Launch

grazie ancora per la pazienza

Marcello
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic

 

Collapse

> 

    Titolo discussione Risposte Autore discussione Visite Ultima azione
No New Posts   5 fab72 128 22 October 2008 - 23:18
Ultimo messaggio di: alcina
No New Posts   0 TevacPhoto 30 27 September 2008 - 15:56
Ultimo messaggio di: TevacPhoto
No New Posts   0 TevacPhoto 17 27 September 2008 - 15:56
Ultimo messaggio di: TevacPhoto
No New Posts   4 NSLuca 251 4 August 2008 - 14:25
Ultimo messaggio di: NSLuca
No new   11 marg 970 2 July 2008 - 07:11
Ultimo messaggio di: marg
No New Posts   4 germinara 238 22 June 2008 - 13:29
Ultimo messaggio di: sirguich_
No New Posts   2 sirguich_ 230 9 June 2008 - 22:14
Ultimo messaggio di: sirguich_
No new   10 Ale93 278 1 June 2008 - 22:15
Ultimo messaggio di: Ale93
No new   11 Cpu86 555 23 March 2008 - 10:14
Ultimo messaggio di: Cpu86
No New Posts   2 nutsmuggler 358 12 March 2008 - 15:17
Ultimo messaggio di: nutsmuggler
No New Posts   5 marg 396 7 February 2008 - 15:16
Ultimo messaggio di: poweruser
No New Posts   2 simotessa 413 25 January 2008 - 14:23
Ultimo messaggio di: simotessa

Modalità di visualizzazione: Normale · Passa a: Lineare · Passa a: Outline


RSS Versione Lo-Fi Oggi è il: 8 January 2009 - 19:45
IP.Board Skin Developed By Creative Networks