2013-09-02 9 views
10

Ho una parte di codice che funziona solo su iOS 6 o versioni successive.Come includere il codice in modo condizionale solo se sopra una determinata versione iOS?

control.tintColor = [UIColor greenColor]; 

c'è un pronto per l'uso direttiva del compilatore come #ifdef iOS6_or_greater?

+2

Avete pensato a tua domanda? La compilazione condizionale produce un binario che dipende da cose diverse (forse l'obiettivo di distribuzione) ma quel binario farà la stessa cosa a prescindere. È necessario fornire controlli di runtime, non controlli in fase di compilazione. – trojanfoe

risposta

17

È meglio controllare la funzionalità anziché la versione di iOS.

Ad esempio, è possibile utilizzare respondsToSelector per verificare se un determinato metodo è supportato.

[someObject respondsToSelector:@selector(someMethod)] 

In mancanza di questo, v'è una direttiva del preprocessore

#if __IPHONE_OS_VERSION_MIN_REQUIRED >= 60000 
- (BOOL)supportedInterfaceOrientations 
{ 
    return UIInterfaceOrientationMaskPortrait; 
} 
#endif 
+1

Questa è la risposta corretta. 'tintColor' è stato aggiunto a' UIView' in iOS 7. OP dovrebbe usare 'respondsToSelector:' invece di usare i controlli del numero di versione. –

+0

Nel mio caso incasinato avevo bisogno della direttiva del compilatore #if perché devo compilare i miei ios7 su un macbook con xcode 5 ma tutto il mio lavoro quotidiano deve essere compilato su un vecchio Mac Pro che non supporta il 10.8 e quindi non supporta xcode 5. Tutti i miei altri strumenti, psd, ecc sono sul Mac Pro. Quindi devo prendere il codice avanti e indietro tra i due. La direttiva del compilatore sopra rende facile e mi aiuterà a non dimenticare di decommentare il codice ios7 alla fine. Quindi grazie per aver elencato entrambi! +1 – badweasel

+0

La risposta dice "è meglio" e @MikeWeller dice che è "la risposta corretta". Qualche ragione per cui? Personalmente, preferisco i controlli di versione perché puoi rimuoverli in seguito, e sono tutti uguali. –

0

si può andare per questo ...........

float currSysVerFloat = [[[UIDevice currentDevice] systemVersion]floatValue]; 
if (currSysVerFloat>=6.0) { 
    isversion6=TRUE; 
    control.tintColor = [UIColor greenColor]; 
    //This is iOS6 or greater 
} else { 
    //do nothing 
    isversion6 = FALSE; 
} 
+2

Questo è un modo terribile per verificare l'esistenza di un nuovo selettore. Non dovresti quasi mai controllare la versione del sistema. Usa 'replysToSelector:' al posto. –

+0

@MikeWeller Se 'control' sembra essere un' UIButton' che potrebbe non essere quello che vuoi. 'UIButton' ha un' tintColor' da iOS 5.0, 'UISegmentedControl' anche a partire dalla 2.0, mentre altri controlli no. Colorare solo i pulsanti sembra stupido, quindi controllare la versione del sistema operativo * potrebbe * essere la cosa giusta da fare. –

+0

Basta dare un'occhiata a chiunque tenti di usarlo in watchOS: UIDevice non esiste nell'SDK watchOS. –

0

ho appena darvi base codice del sistema di confronto versione

scrivere il seguente codice in

#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending) 

il tuo projectName-Prefix.pch così puoi accedervi ovunque desideri.

e applicarlo come tale condizione come

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6")) 
{ 

} 
else 
{ 

} 
+0

Solo un testa a tutti quelli che cercano di usarlo in watchOS: 'UIDevice' non esiste nell'SDK watchOS. –

Problemi correlati