UIAlertController if iOS 8, otherwise UIAlertView

点点圈 提交于 2019-11-29 02:53:55

Please see the answer of Erwan (below my answer) as I see it is the best.

--

You can check the iOS version to use appropriate control like this:

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

I think a much better way to check if a class exists (since iOS 4.2) is:

if([ClassToBeChecked class]) {

   // use it

} else {

  // use alternative

}

In your case, that would be:

if ([UIAlertController class]) {
   // use UIAlertController

} else {
  // use UIAlertView

}

Objective C (as mentioned above)

if ([UIAlertController class]) {
    // use UIAlertController

} else {
    // use UIAlertView

}

Swift

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

} else {
  // use UIAlertController

}

Don't use if NSClassFromString("UIAlertController") == nil It is not working because the signature for this method is func NSClassFromString(_ aClassName: String!) -> AnyClass!

As others have already mentioned - always check whether a feature exists. I believe the safest approach is following:

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

With the obvious risk of entering a class name with a typo. :)

From documentation of NClassFromString:

[Returns] The class object named by aClassName, or nil if no class by that name is currently loaded. If aClassName is nil, returns nil.

Availability iOS (2.0 and later)

Solution for checking iOS version in 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")
}

Con of this solution: it is simply bad practice to check against OS version numbers, whichever way you do it. One should never hard code dependencies in this way, always check for features, capabilities or the existence of a class. Consider this; Apple may release a backwards compatible version of a class, if they did then the code you suggest would never use it as your logic looks for an OS version number and NOT the existence of the class.

(Source of this information)

Solution for checking the class' existence in Swift

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

Do not use if (NSClassFromString("UIAlertController") == nil) because it works correctly on the iOS simulator using iOS 7.1 and 8.2, but if you test on a real device using iOS 7.1, you will unfortunately notice that you will never pass through the else part of the code snippet.

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

Create simple utility function to reduce 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;
}


USE :

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



Or Use system constant NSFoundationVersionNumber_iOS_7_1 as below
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
{
   // Code for iOS8 and above
}
else
{
   // Code for iOS7 and below
}


for more options Link

I have created very simple wrapper in Objective-C, that supports both - old iOS UIAlertView and new one UIAlertViewController

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

It also brings the new action blocks usage to old UIAlertView

Sample:

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

I have written one class that wrap the UIAlertView and use UIAlertController. For the programmer is transparently hence is sufficient import this classes in the project. The utility of this classes is when in a old project there are more UIAlertView to change. Link: https://github.com/kennymuse/UIAlertView

Method one

by ios system version check

#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
}

Method two

by system feature detect

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

But,there's a third lib named PSTAlertController that deal with backwards compatible to iOS 7 of UIActionSheet and UIAlertView.

ref to

Try below code. It works fine for both iOS 8 and below version.

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];
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!