UIAlertController如果是iOS 8,否则是UIAlertView

时间:2014-06-17 17:59:04

标签: ios uialertview ios8 uialertcontroller

我想要符合iOS 8中使用的UIAlertController,因为现在不推荐使用UIAlertView。有没有办法在不破坏对iOS 7的支持的情况下使用它?是否有某种if条件我可以检查iOS 8,否则为iOS 7支持做其他事情?

11 个答案:

答案 0 :(得分:99)

我认为检查类是否存在(从iOS 4.2开始)的更好方法是:

if([ClassToBeChecked class]) {

   // use it

} else {

  // use alternative

}

在你的情况下,那将是:

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

} else {
  // use UIAlertView

}

答案 1 :(得分:12)

目标C(如上所述)

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

} else {
    // use UIAlertView

}

夫特

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

} else {
  // use UIAlertController

}

不要使用if NSClassFromString("UIAlertController") == nil它无效,因为此方法的签名为func NSClassFromString(_ aClassName: String!) -> AnyClass!

答案 2 :(得分:4)

请看 Erwan 的答案(在我的回答下面),因为我觉得这是最好的。

-

您可以检查iOS版本以使用适当的控件:

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

答案 3 :(得分:3)

正如其他人已经提到的那样 - 始终检查是否存在某个功能。我相信最安全的方法是:

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

存在输入带有拼写错误的类名的明显风险。 :)

来自 NClassFromString 的文档:

  

[返回]由aClassName命名的类对象,如果当前未加载该名称的类,则为nil。如果aClassName为nil,则返回nil。

     

可用性iOS(2.0及更高版本)

答案 4 :(得分:2)

在Swift中检查iOS版本的解决方案

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

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

此解决方案的结论:无论您采用哪种方式检查操作系统版本号,都是不好的做法。永远不应该以这种方式硬编码依赖关系,总是检查功能,功能或类的存在。考虑一下; Apple可能会发布类的向后兼容版本,如果他们这样做,那么您建议的代码永远不会使用它,因为您的逻辑查找操作系统版本号而不是类的存在。

Source of this information

检查类在Swift中是否存在的解决方案

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

不要使用if (NSClassFromString("UIAlertController") == nil),因为它在使用iOS 7.1和8.2的iOS模拟器上正常工作,但如果您使用iOS 7.1在真实设备上进行测试,您将会发现您将永远不会通过其他部分代码片段。

答案 5 :(得分:1)

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

答案 6 :(得分:1)

创建简单的utility function以减少代码

代码:

// 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;
}


使用:

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


<小时/> 或使用系统常量NSFoundationVersionNumber_iOS_7_1,如下所示

if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1)
{
   // Code for iOS8 and above
}
else
{
   // Code for iOS7 and below
}


了解更多选项Link

答案 7 :(得分:1)

我在Objective-C中创建了非常简单的包装器,它支持旧的iOS UIAlertView和新的UIAlertViewController

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

它还将新的操作块用法带到旧UIAlertView

样品:

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

答案 8 :(得分:1)

我编写了一个包装UIAlertView并使用UIAlertController的类。因为程序员是透明的,因此足以在项目中导入这些类。这个类的实用程序是在旧项目中有更多UIAlertView要更改。链接:https://github.com/kennymuse/UIAlertView

答案 9 :(得分:0)

方法一

通过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
}

方法二

通过系统功能检测

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

但是,有一个名为PSTAlertController的第三个lib处理向后兼容UIActionSheet和U​​IAlertView的iOS 7。

参考

答案 10 :(得分:0)

尝试以下代码。它适用于iOS 8及以下版本。

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