Pagine

2012-03-24

Metodi deprecati e nuove funzionalità

Dispiace dover sospendere il supporto al 10.5, ma in Snow Leopard e Lion sono state introdotte in Cocoa molte possibilità aggiuntive.
La più semplice da implementare senza problemi è certamente la nuova modalità di Full Screen nel 10.7: basta semplicemente aprire in Xcode il nib, selezionare la finestra a cui vogliamo aggiungere questa funzionalità e scegliere nel menu drop-down Full Screen la voce Primary Window.
Il risultato sarà che in Lion la finestra potrà andare a schermo pieno, mentre nei precedenti sistemi la cosa non sarà disponibile ma comunque non creerà problemi.

Più difficile invece gestire alcune funzioni che nel 10.6 e 10.7 sono deprecate, mentre nel 10.5 devono essere usate. In questo caso, il procedimento, pur essendo semplice, deve essere ragionato.

Base + Deployment

L'SDK usato come base deve contenere entrambi metodi (quello attuale e quello deprecato), per cui conviene impostarlo all'SDK più recente (nell'esempio corrente può andare anche quello del 10.6, che contiene il metodo che funziona anche sul 10.7. Per far questo, nel navigatore di sinistra di Xcode clicchiamo sulla prima riga (dove c'è il nome del progetto); nella schermata che viene fuori, altro click sul nome del Project; altro click su Build Settings. Nella lista di impostazioni, cerchiamo la voce Base SDK e impostiamo Mac OS X 10.6; poi cerchiamo la voce Mac OS X Deployment Target e impostiamo a Mac OS X 10.5.
Ora ripetiamo le stesse impostazioni dopo aver cliccato a sinistra sul target del nostro software.
Per verificare che tutto sia a posto, andiamo sul tab Summary in alto, da cui dovremmo vedere la conferma che il Deployment è sul 10.5.

Implementazione

Ora la parte più concettuale: dobbiamo trovare una funzionalità introdotta dal 10.6, cioè che sul 10.5 non esisteva. Il caso che andremo ad esaminare è legato all'apertura di un file tramite un NSOpenPanel, dove vogliamo che l'utente possa selezionare solo alcuni tipi di file.
Il problema è che sul 10.5 si usa il metodo runModalForDirectory:file:types:, mentre nel 10.6 e seguenti tale metodo è deprecato (esiste ancora e funziona, ma in seguito potrebbe essere eliminato) e occorre usare il metodo runModal e in precedenza usare altri metodi per definire la directory di partenza ed i tipi permessi.
Il tutto è complicato dal fatto che il metodo setAllowedFileTypes esiste anche nel 10.5, ma non ha alcun effetto! Anzi, chiamandolo si annulla l'eventuale precedente impostazione! Occorre trovare un altro metodo che ci permetta di discriminare.
Io ho scelto setDirectoryURL, introdotto nel 10.6 per impostare la directory di partenza. Per verificare se questo metodo esiste (e allora siamo sul 10.6) userò il metodo comune respondsToSelector.
Inoltre, noi siamo puristi della programmazione per cui non vogliamo per nessun motivo duplicare inutilmente del codice, usando un IF per scegliere una via o l'altra.

Per prima cosa, settiamo il pannello di apertura e costruiamo il vettore che contiene i tipi permessi:
NSOpenPanel *myPanel = [NSOpenPanel openPanel];
[myPanel setCanChooseFiles:true];
[myPanel setAllowsMultipleSelection:YES];
[myPanel setCanChooseDirectories:NO];
[myPanel setTitle:@"titolo"];
[myPanel setMessage:@"spiegazione"];
NSArray *allowedTypes = [NSArray arrayWithObjects:@"png",@"gif"];
[myPanel setAllowedFileTypes:allowedTypes];
Ora la pensata: usiamo il costrutto IF nella forma implicita, dove avviene l'apertura del pannello con uno dei due metodi, a seconda del sistema:
BOOL ok = ( [myPanel respondsToSelector:@selector(setDirectoryURL:)] ) ? 
          ( [myPanel runModal] == NSFileHandlingPanelOKButton ) : 
          ( [myPanel runModalForDirectory:nil file:nil types:allowedTypes] == NSOKButton );
Notiamo che la scelta viene fatta sul risultato del metodo respondsToSelector:.
A questo punto il pannello è ormai chiuso e a noi basta controllare se la variabile ok è vera (cioè l'utente ha fatto una scelta e cliccato su ok:
if ( ok ) {
   <...facciamo qualcosa...>
}

Nota: avremmo anche potuto calcolare la versione del sistema su cui ci troviamo, ma questo implica operazioni non semplici e qualche volta con risultati strani; in questo modo, la sequenza è semplicissima.

Nessun commento:

Posta un commento