web-dev-qa-db-fra.com

UIAlertController si iOS 8, sinon UIAlertView

Je souhaite me conformer à UIAlertController utilisé dans iOS 8, car UIAlertView est désormais obsolète. Existe-t-il un moyen de l'utiliser sans rompre la prise en charge d'iOS 7? Existe-t-il une sorte de condition si je peux vérifier pour iOS 8, sinon faire autre chose pour le support iOS 7?

27
Triton Man

S'il vous plaît voir la réponse de Erwan (ci-dessous ma réponse) comme 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
Jennifer Houston

Je pense qu'un meilleur moyen 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
Erwan

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

}

N'utilisez pas if NSClassFromString("UIAlertController") == nil. Il ne fonctionne pas car la signature de cette méthode est func NSClassFromString(_ aClassName: String!) -> AnyClass!

12
goce

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 :

[Retours] 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
xius

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")
}

Inconvénient de cette solution: il est simplement déconseillé de vérifier les numéros de version d’OS, quelle que soit la méthode choisie. Il ne faut jamais que les dépendances de code durs de cette manière, vérifient toujours 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 suggérez ne l'utilisera jamais car votre logique recherche un numéro de version du système d'exploitation et NON 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+
}

N'utilisez pas if (NSClassFromString("UIAlertController") == nil) car il fonctionne correctement sur le simulateur iOS utilisant iOS 7.1 et 8.2, mais si vous effectuez un test sur un périphérique réel utilisant iOS 7.1, vous remarquerez malheureusement que vous ne passerez jamais par le reste de l'extrait de code.

2
King-Wizard

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

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

Cela amène également la nouvelle action à l’utilisation de la vieille 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
Martin Perry
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
      //Use UIAlertController    
}
else
{
     //UIAlertView
}
1
Sabareesh

J'ai écrit une classe qui encapsule UIAlertView et utilise UIAlertController. Pour le programmeur est transparent, il est donc suffisant d'importer ces classes dans le projet. L'utilité de cette classe est que, dans un ancien projet, il y a plus de UIAlertView à changer. Lien: https://github.com/kennymuse/UIAlertView

1
kennymuse

Créer un utility function simple pour 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 Utilisez la constante système NSFoundationVersionNumber_iOS_7_1 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
Jageen

Essayez ci-dessous le code. Cela fonctionne très bien pour les versions iOS 8 et inférieures.

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];
}
0
amitshinik

Méthode 1

par 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 fonctionnalité du système détecter

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

Mais, il existe une troisième bibliothèque appelée PSTAlertController qui traite de la compatibilité ascendante avec iOS 7 d'UIActionSheet et d'UIAlertView.

ref à

0
monjer