2013-09-02 1 views
10

Ich habe ein Stück Code, der nur auf iOS 6 oder höher funktioniert.Wie kann Code nur bedingt über einer bestimmten iOS-Version enthalten sein?

control.tintColor = [UIColor greenColor]; 

Gibt es eine Compiler-Direktive bereit wie #ifdef iOS6_or_greater zu benutzen?

+2

Sie Ihre Frage gedacht? Bedingte Kompilierung erzeugt eine Binärdatei, die von verschiedenen Dingen abhängt (vielleicht dem Implementierungsziel), aber diese Binärdatei wird das Gleiche tun. Sie müssen Laufzeitprüfungen und keine Kompilierungszeitprüfungen bereitstellen. – trojanfoe

Antwort

17

Es ist am besten, wenn Sie die Funktionalität überprüfen gegen anstelle der iOS-Version.

Zum Beispiel können Sie respondsToSelector verwenden, um zu sehen, ob ein bestimmtes Verfahren unterstützt wird.

[someObject respondsToSelector:@selector(someMethod)] 

dass Andernfalls gibt es eine Präprozessordirektive

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

Dies ist die richtige Antwort. 'tintColor' wurde in iOS 7 zu' UIView' hinzugefügt. OP sollte 'answerToSelector:' anstelle von Versionsnummern verwenden. –

+0

In meinem vermasselt Fall musste ich die #if Compiler-Direktive, weil ich mit Xcode 5 auf einem macbook zu tun haben, aber alle meine tägliche Arbeit meine ios7 kompiliert auf einem älteren Mac Pro kompiliert werden muss, die nicht 10.8 unterstützt und Daher unterstützt xcode 5 nicht. Alle meine anderen Tools, PSD usw. sind auf dem Mac Pro. Also muss ich den Code zwischen den beiden hin und her bringen. Die obige Compiler-Anweisung macht es einfach und wird mir helfen, nicht zu vergessen, den ios7-Code am Ende auskommentieren. Also vielen Dank für die Auflistung! +1 – badweasel

+0

Die Antwort sagt "es ist am besten" und @MikeWeller sagt, es ist "die richtige Antwort." Irgendein Grund warum? Persönlich bevorzuge ich die Versionsüberprüfungen, weil Sie sie später entfernen können, und sie sind alle gleich. –

0

Sie hierfür gehen ...........

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

Dies ist ein schrecklicher Weg, um auf die Existenz eines neuen Selektors zu prüfen. Sie sollten die Systemversion fast nie überprüfen müssen. Verwenden Sie stattdessen 'answerToSelector:'. –

+0

@MikeWeller Wenn 'control' zufällig ein' UIButton' ist, könnte das nicht das sein, was Sie wollen. 'UIButton' hat eine' tintColor' seit iOS 5.0, 'UISegmentedControl' schon seit 2.0, andere Controls nicht. Nur Tasten zu färben erscheint dumm, also könnte die Überprüfung der OS-Version * das Richtige sein. –

+0

Nur ein Blick auf jeden, der versucht, dies in watchOS zu verwenden: UIDevice existiert nicht im watchOS SDK. –

0

ich Ihnen nur grundlegende geben Code des Vergleichssystemversion

Den folgenden Code in

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

Ihre projectName-Prefix.pch so können Sie es überall zugreifen Sie wollen.

Und es als Bedingung gelten so wie

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6")) 
{ 

} 
else 
{ 

} 
+0

Nur ein Blick auf jeden, der versucht, dies in watchOS zu verwenden: 'UIDevice' existiert nicht im watchOS SDK. –

Verwandte Themen