2010-05-03 11 views
10

Sto lavorando a una nuova app che voglio essere universale per iPhone e iPad. Ho iniziato con la procedura guidata "Crea un'app per Windows" e ho creato delegati separati per app nei gruppi "iPhone" e "iPad". Dato che conoscevo già l'iPhone Dev, ho fatto quella parte del mio progetto, e ora sono pronto per fare alcune cose sull'iPad.Come si esegue un'applicazione universale sul simulatore di iPhone 3.1.3?

Quindi ... ho iniziato aggiungendo un UISplitViewController al mio delegato iPad, ho attivato Active SDK a 3.2 e funziona! Ma quando torno alla 3.1.3 e provo ad eseguirlo nel simulatore, Build and Go fallisce. Per i principianti, vedo:

...path.../iPad/AppDelegate_Pad.h:13: error: expected specifier-qualifier-list before 'UISplitViewController'

Ho il mio SDK di base impostato su 3.2 e il mio obiettivo di distribuzione impostato su 3.1.3. Ho pensato che fosse abbastanza. Ma ho anche trovato nella documentazione questo metodo per compilare in modo condizionale:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 
    MyIPadViewController* vc; 
// Create the iPad view controller 
#else 
    MyIPhoneViewController* vc; 
// Create the iPhone view controller 
#endif 

Così ho bisogno di farlo ovunque? Sembra un sacco di codice da aggiungere (che mi sbarazzerò comunque in poco tempo per 4.0) quindi mi sento come se dovessi fare qualcosa di sbagliato. E, non ho nemmeno idea di come funzioni per cose come @property o @synthesize dichiarazioni.

tl; versione dr della domanda - mi sono perso un'impostazione da qualche parte?

+0

La risposta di progrmr è più appropriata, accettarla in modo che i lettori possano ottenere facilmente la risposta giusta. –

risposta

23

Piuttosto il contrario. Un'app universale esegue lo stesso binario su iPhone e iPad, quindi non è possibile utilizzare la compilazione condizionale per distinguere tra le due versioni. Ma è necessario utilizzare la macro di Apple cita nella documentazione:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // iPad-specific code 
} else { 
    // iPhone-specific code 
} 
+0

Così come aggiungo qualcosa di simile a un file di intestazione, dove sto dichiarando una variabile di tipo UISplitViewController? Dovrei avere un blocco if/else in esso? – bpapa

+0

No, puoi solo dichiararlo. Build for iPhone Device 3.2 e verrà eseguito sul tuo dispositivo 3.0/3.1. –

+0

I blocchi di compilazione condizionale sono utili se si desidera testare l'app in Simulatore iPhone 3.1 (poiché il simulatore 3.2 non supporta l'esecuzione di un'app universale in modalità iPhone). –

39

Io uso questa funzione C per contribuire a mantenere il codice conciso:

BOOL isPad() { 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

Un'altra cosa che faccio, quando ho diversi file XI ter per iPhone vs iPad. Ho una funzione stripPadSuffixOnPhone(), che aiuta a mantenere il codice più semplice:

// Load/create the Delete table cell with delete button 
self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
          ClassName:@"DeleteCell" 
        Owner:self]; 

Cose del genere possono rendere la codifica più semplice e molto meno i condizionali. Devo comunque provare tutto due volte.

+0

Sarà fantastico se condividi la tua classe 'Utilities' con noi! : P :);) – rptwsthi

+2

Sono su [github] (https://github.com/progrmr/SDK_Utilities/tree/master/Utils) – progrmr

0

Ecco ciò che funziona per me:

  1. creare l'app utilizzando SDK 3.2.
  2. Cambia l'SDK attivo in iPhone Simulator 3.1.3 (o qualsiasi altra cosa).
  3. Dal menu Esegui, selezionare Debug (non Build and Debug).

Il file binario costruito in 3.2 verrà installato nel simulatore 3.x senza ricostruzione. Al termine, non dimenticare di reimpostare l'SDK attivo su 3.2.

+0

L'installazione di riserva dell'SDK 3.2 elimina gli SDK 3.1.x, quindi non è possibile impostarli come SDK attivo. –

Problemi correlati