Question UIAlertController si iOS 8, sinon UIAlertView


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


27
2018-06-17 17:59


origine


Réponses:


S'il vous plaît voir la réponse de 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
}

4
2018-06-30 08:51



Je pense qu'une meilleure façon de vérifier si une classe 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

}

99
2017-09-04 02:36



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 NSClassFromString("UIAlertController") == nil Il ne fonctionne pas car la signature de cette méthode est func NSClassFromString(_ aClassName: String!) -> AnyClass! 


12
2018-01-19 14:02



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 (NSClassFromString(@"UIAlertController")) {
    // use UIAlertController
} else {
    // use UIAlertView
}

Avec le risque évident de saisir un nom de classe avec une faute de frappe. :)

De la documentation de NClassFromString:

[Retourne] L'objet de classe nommé par aClassName ou nil si aucune classe de ce nom n'est actuellement chargée. Si aClassName est nil, renvoie nil.

Disponibilité iOS (2.0 et versions ultérieures)


3
2017-10-23 11:45



Solution pour vérifier la version iOS dans Swift

switch (UIDevice.currentDevice().systemVersion.compare("8.0.0", options: NSStringCompareOptions.NumericSearch)) {
    case .OrderedAscending:
       println("iOS < 8.0")

    case .OrderedSame, .OrderedDescending:
       println("iOS >= 8.0")
}

En ce qui concerne cette solution: vérifier les numéros de version du système d'exploitation, quel que soit le moyen utilisé, est une mauvaise pratique. On ne devrait jamais avoir des dépendances de code rigides de cette façon, toujours vérifier les fonctionnalités, les capacités ou l'existence d'une classe. Considère ceci; Apple peut publier une version rétrocompatible d'une classe, si c'est le cas, le code que vous proposez ne l'utilisera jamais, car votre logique recherche un numéro de version du système d'exploitation et PAS l'existence de la classe.

(Source de cette information)

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

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

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


2
2018-03-18 11:37



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

1
2017-07-24 14:21



Créer simple utility function réduire le code

CODE:

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


UTILISATION :

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



Ou utiliser la constante du 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 Lien


1
2017-08-26 08:50



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

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

Il apporte également l’utilisation des nouveaux blocs d’action à l’ancienne 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];

1
2017-12-15 10:22