为啥 iOS7 中的 UIAlertController 收到 nil 值?

Posted

技术标签:

【中文标题】为啥 iOS7 中的 UIAlertController 收到 nil 值?【英文标题】:why UIAlertController in iOS7 received nil value?为什么 iOS7 中的 UIAlertController 收到 nil 值? 【发布时间】:2014-11-03 08:00:12 【问题描述】:

为什么 ios7 中的 UIAlertController 收到 nil 值而需要呈现但在 iOS8 中工作很好,我知道这是因为 iOS7 不支持 UIAlertController 类吗?

UIAlertController *view=[UIAlertController
                        alertControllerWithTitle:@"Hello"
                        message:nil
                        preferredStyle:UIAlertControllerStyleAlert];

 [self presentViewController:view animated:NO completion:nil];

【问题讨论】:

UIAlertController 是为 iOS 8 引入的。它在 iOS7 中不起作用。对于 iOS7,您应该使用 UIAlertView。 ***.com/questions/25111011/… 我创建了一个简单的包装类,可以同时使用两者。它模仿 UIAlertController。 github.com/Reggian/RAAlertController 【参考方案1】:

这些类仅适用于 iOS8 及更高版本。见class reference

【讨论】:

【参考方案2】:

为了在iOS 8 和更低版本中显示AlertView,您可以使用以下代码:

if ([self isiOS8OrAbove]) 
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title
                                                                             message:message
                                                                      preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK"
                                                       style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction *action) 
                                                         [self.navigationController popViewControllerAnimated:YES];
                                                     ];

    [alertController addAction:okAction];
    [self presentViewController:alertController animated:YES completion:nil];
 else 
    UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:title
                                                         message:message
                                                        delegate:nil
                                               cancelButtonTitle:@"OK"
                                               otherButtonTitles: nil];
    [alertView show];
    [self.navigationController popViewControllerAnimated:YES];


- (BOOL)isiOS8OrAbove 
    NSComparisonResult order = [[UIDevice currentDevice].systemVersion compare: @"8.0"
                                                                       options: NSNumericSearch];
    return (order == NSOrderedSame || order == NSOrderedDescending);

【讨论】:

但我认为检查类比检查系统版本更好?【参考方案3】:

您使用的操作系统版本可能低于 iOS 8

如果您使用 Xcode 6 编译代码并使用 iOS 版本

- (void)showXYZAlert

    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
    
        // Handle UIAlertController
        [self showXYZAlertController];
    
    else
    
        // Handle UIAlertView
        [self showXYZAlertControllerView];
    

【讨论】:

以上是关于为啥 iOS7 中的 UIAlertController 收到 nil 值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥iOS7中的bottomLayoutGuide和automaticAdjustsScrollViewInsets没有考虑UIToolBar的高度(带有自动布局)

UIAlertView,UIActionSheet和iOS8推出UIAlertControl的基本使用

为啥在 iOS7 中没有调用 willUnloadSearchResultsTableView?

为啥我不能在 iOS 7.0 中的 UIScrollView 中滚动?

在 iOS 7 中,为啥视图高度与 iOS 6 中的相同视图不同

为啥 iOS7 模拟器无法启动或按预期启动...?