我正在使用Swift编写应用程序,并且需要显示警报。该应用程序必须兼容iOS 7和iOS 8。既然UIAlertView已被替换UIAlertController,如何在UIAlertController不检查系统版本的情况下检查是否可用?我听说苹果建议我们不要检查设备的系统版本,以确定API的可用性。
UIAlertView
UIAlertController
这是我在iOS 8上使用的功能,但是在iOS 7上使用“ dyld: Symbol not found: _OBJC_CLASS_$_UIAlertAction” 崩溃:
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!
Warning: Attempt to dismiss from view controller <_UIAlertShimPresentingViewController: 0x7bf72d60> while a presentation or dismiss is in progress!
检测模式与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版本有效的当前版本
NSClassFromString("UIAlertController")
-O
编辑2
NSClassFromString 在Xcode 6.3 / Swift 1.2中进行所有优化
NSClassFromString