UIAlertController si iOS 8, sinon UIAlertView

Je veux me conformer au UIAlertController utilisé dans iOS 8 car UIAlertView est maintenant obsolète. Y at-il un moyen que je peux utiliser cela sans casser le support pour iOS 7? Y at-il une sorte de condition si je peux faire pour vérifier iOS 8 sinon faire autre chose pour le support iOS 7?

S'il vous plaît voir la réponse d' Erwan (ci-dessous ma réponse) car je vois que c'est le meilleur.

Vous pouvez vérifier la version iOS pour utiliser le contrôle approprié comme ceci:

 if (([[[UIDevice currentDevice] systemVersion] compare:@"8.0" options:NSNumericSearch] == NSOrderedAscending)) { // use UIAlertView } else { // use UIAlertController } 

Je pense que la meilleure façon de vérifier si une class existe (depuis iOS 4.2) est:

 if([ClassToBeChecked class]) { // use it } else { // use alternative } 

Dans votre cas, ce serait:

 if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView } 

Objectif C (comme mentionné ci-dessus)

 if ([UIAlertController class]) { // use UIAlertController } else { // use UIAlertView } 

Rapide

 if objc_getClass("UIAlertController") == nil { // use UIAlertView } else { // use UIAlertController } 

Ne pas utiliser if NSClassFromSsortingng("UIAlertController") == nil Cela ne fonctionne pas car la signature de cette méthode est func NSClassFromSsortingng(_ aClassName: Ssortingng!) -> AnyClass!

Comme d'autres l'ont déjà mentionné, vérifiez toujours si une fonctionnalité existe. Je crois que l'approche la plus sûre est la suivante:

 if (NSClassFromSsortingng(@"UIAlertController")) { // use UIAlertController } else { // use UIAlertView } 

Avec le risque évident d'entrer un nom de class avec une faute de frappe. 🙂

De la documentation de NClassFromSsortingng :

[Renvoie] Objet de class nommé par aClassName ou nul si aucune class de ce nom n'est actuellement chargée. Si aClassName est nul, renvoie zéro.

Disponibilité iOS (2.0 et ultérieure)

Solution pour vérifier la version iOS dans Swift

 switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSSsortingngCompareOptions.NumericSearch)) { case .OrderedAscending: println("iOS < 8.0") case .OrderedSame, .OrderedDescending: println("iOS >= 8.0") } 

Con de cette solution: il est simplement une mauvaise pratique de vérifier les numéros de version du operating system, de quelque manière que vous le fassiez. On ne devrait jamais coder les dependencies de cette façon, toujours vérifier les caractéristiques, les capacités ou l'existence d'une class. Considère ceci; Apple peut publier une version rétrocompatible d'une class, si c'est le cas, le code que vous proposez ne l'utilisera jamais car votre logique search un numéro de version de operating system et NON l'existence de la class.

( Source de cette information )

Solution pour vérifier l'existence de la class dans Swift

 if (objc_getClass("UIAlertController") == nil) { // iOS 7 } else { // iOS 8+ } 

N'utilisez pas if (NSClassFromSsortingng("UIAlertController") == nil) car il fonctionne correctement sur le simulateur iOS en utilisant iOS 7.1 et 8.2, mais si vous testez sur un vrai périphérique en utilisant iOS 7.1, vous remarquerez malheureusement que vous ne passerez jamais à travers la partie else de l'extrait de code.

 // Above ios 8.0 float os_version = [[[UIDevice currentDevice] systemVersion] floatValue]; if (os_version >= 8.000000) {   //Use UIAlertController } else { //UIAlertView } 

Créer une utility function simple pour réduire le code

CODE:

 // pass minimum required iOS version BOOL isOSSupported(NSSsortingng *minRequiredVersion) { NSSsortingng *currSysVer = [[UIDevice currentDevice] systemVersion]; BOOL isOSSupported = ([currSysVer compare:minRequiredVersion options:NSNumericSearch] != NSOrderedAscending) && ![currSysVer isEqualToSsortingng:@"Unknown"]; return isOSSupported; } 

UTILISATION :

 if(isOSSupported("8.0") { // Code for iOS8 and above } else { // Code for iOS7 and below } 


Ou Utilisez la constante système NSFoundationVersionNumber_iOS_7_1 comme ci-dessous

 if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) { // Code for iOS8 and above } else { // Code for iOS7 and below } 

pour plus d'options Link

J'ai créé un wrapper très simple en Objective-C, qui supporte à la fois – l'ancien iOS UIAlertView et le nouveau UIAlertViewController

https://github.com/MartinPerry/UIAlert/

Il apporte également la nouvelle utilisation des blocs d'action à l'ancien UIAlertView

Échantillon:

 MyAlertMessage * a = [[MyAlertMessage alloc] initWithTitle:@"Hello" WithMessage:@"World"]; [a addButton:BUTTON_OK WithTitle:@"OK" WithAction:^(void *action) { NSLog(@"Button OK at index 0 click"); }]; [a addButton:BUTTON_CANCEL WithTitle:@"Cancel" WithAction:^(void *action) { NSLog(@"Button Cancel at index 1 click"); }]; [a show]; 

J'ai écrit une class qui enveloppe le UIAlertView et utilise UIAlertController. Pour le programmeur est donc d'importer de manière transparente ces classs dans le projet. L'utilité de ces classs est quand dans un ancien projet il y a plus de UIAlertView à changer. Lien: https://github.com/kennymuse/UIAlertView

Méthode un

par la vérification de la version du système ios

 #define iOSVersionLessThan(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending) // below ios8 ,create UIAlertView if(iOSVersionLessThan(@"7.0")){ // todo // ios8 and above ,UIActionController avaliable }else{ // todo } 

Méthode deux

par détection de caractéristique du système

 // create UIActionController if([UIActionController class]){ // todo // create UIAlertView }else{ // todo } 

Mais, il y a une troisième bibliothèque nommée PSTAlertController qui traite rétrocompatible avec iOS 7 de UIActionSheet et UIAlertView.

ref à

  • Prise en charge de plusieurs versions d'iOS
  • Soutenir iOS 6
  • Prise en charge de plusieurs versions et périphériques iOS

Essayez le code ci-dessous. Cela fonctionne bien pour iOS 8 et version inférieure.

 if (IS_OS_8_OR_LATER) { UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) { }]; [alertVC addAction:cancelAction]; [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{ }]; } else{ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; [alert show]; }