2013-09-02 17 views
10

Mam fragment kodu, który działa tylko w systemie iOS 6 lub nowszym.Jak warunkowo dołączyć kod tylko powyżej określonej wersji systemu iOS?

control.tintColor = [UIColor greenColor]; 

Czy istnieje gotowa do użycia dyrektywa kompilująca, taka jak #ifdef iOS6_or_greater?

+2

czy pomyślałeś o swoje pytanie? Kompilacja warunkowa produkuje plik binarny w zależności od różnych rzeczy (być może docelowego wdrożenia), ale ten plik binarny robi to samo niezależnie. Należy zapewnić kontrole środowiska wykonawczego, a nie kontrole czasu kompilacji. – trojanfoe

Odpowiedz

17

Najlepiej, jeśli sprawdzisz funkcjonalność zamiast wersji na iOS.

Na przykład możesz użyć funkcji replysToSelector, aby sprawdzić, czy dana metoda jest obsługiwana.

[someObject respondsToSelector:@selector(someMethod)] 

W przeciwnym razie, jest dyrektywa preprocesora

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

To jest poprawna odpowiedź. 'tintColor' został dodany do' UIView' w iOS 7. OP powinien używać 'replysToSelector:' zamiast używania sprawdzania numeru wersji. –

+0

W mojej przykręconej obudowie potrzebowałem dyrektywy kompilatora #if, ponieważ muszę zrobić kompilację ios7 na macbookach z xcode 5, ale wszystkie moje codzienne prace muszą być skompilowane na starszym mac pro, który nie obsługuje 10.8 i w związku z tym nie obsługuje xcode 5. Wszystkie moje inne narzędzia, psd, itp. są na mac pro. Więc muszę wziąć kod tam iz powrotem między tymi dwoma. Powyższa dyrektywa kompilująca ułatwia i pomoże mi nie zapomnieć odkomentować kodu ios7 na końcu. Więc dzięki za wpisanie obu! +1 – badweasel

+0

Odpowiedź mówi "jest najlepiej", a @MikeWeller mówi, że to "poprawna odpowiedź". Jakiś powód, dlaczego? Osobiście wolę sprawdzanie wersji, ponieważ możesz je później usunąć i wszystkie są takie same. –

0

można pójść na to ...........

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

To jest straszny sposób na sprawdzenie istnienia nowego selektora. Powinieneś prawie nigdy nie potrzebować sprawdzać wersji systemu. Zamiast tego należy użyć 'respondsToSelector:'. –

+0

@MikeWeller Jeśli 'kontrola' stanie się' Uibutton', który może nie być tym, czego potrzebujesz. 'UIButton' ma' tintColor' od iOS 5.0, 'UISegmentedControl' nawet od 2.0, jeszcze inne kontrolki nie. Przyciski tylko kolorowania wydają się głupie, więc sprawdzenie wersji systemu operacyjnego * może * być właściwe. –

+0

Po prostu kieruje się do każdego, kto próbuje użyć tego w watchOS: UIDevice nie istnieje w zestawie SDK watchOS. –

0

Właśnie daje podstawowy kod systemu porównania wersji

Napisz następujący kod w

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

Twój projectName-Prefix.pch, więc możesz uzyskać do niego dostęp w dowolnym miejscu.

i zastosować go jako warunku takiego jak

if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6")) 
{ 

} 
else 
{ 

} 
+0

Po prostu kieruje się do każdego, kto próbuje użyć tego w watchOS: 'UIDevice' nie istnieje w SDK watchOS. –

Powiązane problemy