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
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 }
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.
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]; }