一尘不染

UIAlertView / UIAlertController iOS 7和iOS 8兼容性

swift

我正在使用Swift编写应用程序,并且需要显示警报。该应用程序必须兼容iOS 7和iOS
8。既然UIAlertView已被替换UIAlertController,如何在UIAlertController不检查系统版本的情况下检查是否可用?我听说苹果建议我们不要检查设备的系统版本,以确定API的可用性。

这是我在iOS 8上使用的功能,但是在iOS 7上使用“ dyld: Symbol not found: _OBJC_CLASS_$_UIAlertAction” 崩溃:

let alert = UIAlertController(title: "Error", message: message, preferredStyle: .Alert)
let cancelAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alert.addAction(cancelAction)
presentViewController(alert, animated: true, completion: nil)

如果我使用iOS 8的UIAlertView,则会收到以下警告: Warning: Attempt to dismiss from view controller <_UIAlertShimPresentingViewController: 0x7bf72d60> while a presentation or dismiss is in progress!


阅读 269

收藏
2020-07-07

共1个答案

一尘不染

检测模式与Objective-C样式相同。

您需要检测当前的活动运行时是否具有实例化此类的能力

if objc_getClass("UIAlertController") != nil {

     println("UIAlertController can be instantiated")

      //make and use a UIAlertController

 }
 else {

      println("UIAlertController can NOT be instantiated")

      //make and use a UIAlertView
}

不要尝试根据操作系统版本来解决这个问题。您需要检测 操作系统能力。

编辑

该答案的原始检测器NSClassFromString("UIAlertController")-O优化后失败,因此将其更改为对Release版本有效的当前版本

编辑2

NSClassFromString 在Xcode 6.3 / Swift 1.2中进行所有优化

2020-07-07