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?
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
}
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
}
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!
.
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)
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.
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];
// Above ios 8.0
float os_version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (os_version >= 8.000000)
{
//Use UIAlertController
}
else
{
//UIAlertView
}
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
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
}
NSFoundationVersionNumber_iOS_7_1
ci-dessousif(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
{
// Code for iOS8 and above
}
else
{
// Code for iOS7 and below
}
pour plus d'options Lien
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];
}
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
}
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.