iOS 7 的 UIAlertView/UIAlertController 兼容性

Posted

技术标签:

【中文标题】iOS 7 的 UIAlertView/UIAlertController 兼容性【英文标题】:UIAlertView/UIAlertController compatibility for iOS 7 【发布时间】:2015-11-16 06:03:48 【问题描述】:

我已阅读UIAlertView/UIAlertController ios 7 and iOS 8 compatibility 线程并尝试实现以下内容:

if objc_getClass("UIAlertController") != nil 

     print("UIAlertController can be instantiated")

      //make and use a UIAlertController

 
 else 

      print("UIAlertController can NOT be instantiated")

      //make and use a UIAlertView

但是在我的环境中,带有 OS X El Capitan 的 Xcode 7.1.1,如果我将部署目标设置为 iOS 7.1,Xcode 会报告有关 UIAlertController 的错误并通过添加可用性来修复它们,如下所示:

if #available(iOS 8.0, *) 
    alertContoller1(alertTitle, alertMessage: alertMessage)

@available(iOS 8.0, *)
func alertContoller1(alertTitle: String, alertMessage: String) 

    let alertController = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: .Alert)

    let okAction = UIAlertAction(title: "OK", style: .Default) 
        (action) -> Void in
        print("OK button tapped.")
    

    alertController.addAction(okAction)

    presentViewController(alertController, animated: true, completion: nil)

然后,当我使用 iOS 模拟器 7.1 (Xcode 6.4) 测试我的应用程序时,我的应用程序立即崩溃。

其次,当我尝试用 Xcode 6.4 打开我的项目时,有两个问题。

1.available(iOS 8.0, *) 部分出现编译错误。

2.如果我删除available(iOS 8.0, *) 部分,我的应用程序会崩溃并出现alertController 实例化错误

所以,这是一种“如果我对一个人是真的,我对另一个人就一定是假的”的情况

我想确认是否真的可以创建同时兼容iOS7.1和iOS8.0及更高版本的警报?

根据我对android软件开发的了解,有注解@targetAPI和@SuppressWarnings("deprecation")。有没有等价的功能?

如果苹果的意图是切断旧设备,谁来拯救那些拥有旧设备的人?

【问题讨论】:

我曾经为 UIAlertController/UIAlertView 写过一个 swift 示例:Adding a simple UIAlertView. 您的 7.1 模拟器可以在 El Capitan 中运行吗?因为我的没有。可能是问题所在。 尝试在7.1模拟器中运行一个空项目。 @FreeNickname 我也无法在 El Capitan 上运行 iOS7.1 模拟器。所以我在我的另一台 Mac (Yosemite/Xcode6.4) 上运行 iOS7.1 模拟器。在Yosemite/Xcode6.4中,不能使用available(iOS 8.0, *)版本检查... 是的,问题是你要么坚持使用新的 Xcode 7+,要么坚持使用旧的 6.4。如果你坚持使用 7+,#availability 会起作用,但你需要一个设备来测试 iOS 7。但如果你使用 Xcode 6.*,你将不得不忘记 Swift 2.0。一种可能的解决方案(虽然有点烦人)是降级到 Yosemite 并使用 Xcode 7.1。据我所知,iOS 7 模拟器应该可以在 Yosemite 上运行良好。 【参考方案1】:

您可以简单地查看设备版本,并在此基础上实例化UIAlertControllerUIAlertView

if Float(UIDevice.currentDevice().systemVersion) >= 8

     print("Instantiate UIAlertController")

else

     print("Instantiate UIAlertView")

替换@available(iOS 8.0, *)

@available(iOS 7, *)
func iOS7Work() 
    // do stuff

    if #available(iOS 8, *) 
        iOS8Work()
    

【讨论】:

对不起,我的问题是,如果我将部署目标设置为iOS7.1,Xcode7上需要UIAlertController相关语句available(iOS 8.0, *) 那么问题是什么?只是说它需要iOS 8.0或更高版本 如果我在 Xcode7.1.1/El Capitan 上使用 available(iOS 8.0, *) 构建应用程序并将应用程序复制到 iOS7.1 模拟器,它会崩溃。此外,我无法在 Xcode6.4/Yosemite 上使用 available(iOS 8.0, *) 构建应用程序。即我无法同时接受 Xcode7.1.1/El Capitan/iOS8 和 Xcode6.4/Yosemite/iOS7.1 的代码... 使用 Xcode7,1 在 iOS 7.1 上构建代码似乎非常困难。就是这样。如果我们想支持 iOS 7,请继续使用 Xcode 6.4。如果您想使用 Xcode 7,请放弃对 iOS 7 的支持。 @Sohil-R-Memon 我根据您的建议修改了代码。适用于 iOS9 模拟器。但是在 iOS 7.1 模拟器上构建应用程序会立即崩溃。当然,我无法在 Xcode6.4 上使用该代码构建应用程序......太伤心了......【参考方案2】:

我为此创建了一个自定义处理程序, 您可以使用 https://github.com/ogres/CUIAlertController ,它是 UIAlertView 的简单替换,它将使用 UIAlertView 用于旧 iOS 版本和 AlertController 用于新版本。

您可以为 Swift 导入并采用它,或者查看源代码并创建类似的行为,

使用很简单

NSMutableArray *actions = [[NSMutableArray alloc] init];

[actions addObject:[CUIAlertAction actionWithTitle:@"Red" block:^
    self.view.backgroundColor = [UIColor redColor];
]];

[actions addObject:[CUIAlertAction actionWithTitle:@"Green" block:^
    self.view.backgroundColor = [UIColor greenColor];
]];

[actions addObject:[CUIAlertAction actionWithTitle:@"Cancel" block:nil]];

[CUIAlertController presentAlertViewWithTitle:@"Color"
                                      message:@"Change background color"
                                      actions:actions
                               fromController:self
                                     animated:YES];

【讨论】:

感谢您介绍自定义处理程序。因为我想把事情简单化,所以这次我不使用你的处理程序......

以上是关于iOS 7 的 UIAlertView/UIAlertController 兼容性的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义声音的 UILocalNotification 仅适用于 iOS 6.1 和 iOS 7.1,不适用于 iOS 7.0

使用 xcode 5 (iOS 7 sdk) 构建 iOS 7 UI

Ipad图标大小Ipad设置ios 5-7 29pt 1x 2x - iPad聚光灯ios 7 40 pt - iPad app ios 7 76 pt [关闭]

iOS 7中的iOS 7 AVPlayer AVPlayerItem持续时间不正确

我们可以使用 iOS 7 SDK 并且仍然支持低于 7 的 iOS 版本吗?

iOS 7.1 - 7.1.2 用户无法打开我的游戏