我当前的项目支持iOS 7+,在我的一个视图控制器中,我正在尝试使用UIAlertView和UIAlertController。
我的方法中有#available条件,但我不知道如何包装变量。
当我有:
var alertController: UIAlertController!
var alertView: UIAlertView!
我收到一条错误消息告诉我UIAlertController仅在iOS 8+中可用,并且“通过”将@available添加到封闭类中来“修复它”选项。但是我认为这标志着整个班级,而这不是我想要的。
答案 0 :(得分:20)
我刚刚遇到这个问题而且我也很难找到解决方案,所以最终使变量变得懒惰并且默认为nil,同时添加了可用性注释
对于您的实现,如下所示:
@available(iOS 8.0, *)
lazy var alertController: UIAlertController? = { return nil }()
然后,无论何时尝试访问该属性,编译器都会确保在可用性检查中对其进行保护,以便您始终拥有:
if #available(iOS 8.0, *) {
self.alertController = ...
} else
self.alertView = ...
}
答案 1 :(得分:1)
如果您只需要在一个函数中使用alert,您只需将代码移动到func块中,XCode 7就会提出可行的建议。
如果您需要在多个func块中使用alert并一遍又一遍地引用同一个警报对象,该怎么办?
您可以使用新的UIResponder并根据可用性将其向下传播到UIAlertController或UIView。我没有在我的项目中测试它,但它应该工作。
let alertContainer: UIResponder?
init () {
if #available(iOS 8.0, *) {
let alertController: UIAlertController!
alertContainer = alertController
} else {
let alertView: UIAlertView!
alertContainer = alertView
}
}
func someFunction () {
if #available(iOS 8.0, *) {
var alertController = alertContainer as! UIAlertController
// use the alertController
} else {
var alertView = alertContainer as! UIAlertView
// use the UIAlertView
}
}
这实际上增加了更多代码,但它通过了Xcode的检查。如果您想出更好的解决方案,请告诉我。