我目前的项目支持iOS 7+,在我的一个视图控制器,我试图同时使用UIAlertView和UIAlertController。
我有#available条件在我的方法中工作,但我不确定如何包装变量。
当我有:
var alertController: UIAlertController!
var alertView: UIAlertView!
我得到一个错误消息告诉我UIAlertController只在iOS 8+中可用,并通过"添加@available到封闭类"来"修复它"。但是,我认为这标记了整个类,这不是我想要的。
我刚刚遇到这个问题,我也一直在努力寻找一个解决方案,所以最终使变量懒惰和默认为nil,同时添加可用性注释
对于您的实现,它看起来像这样:
@available(iOS 8.0, *)
lazy var alertController: UIAlertController? = { return nil }()
当你试图访问该属性时,编译器将确保它在可用性检查中受到保护,所以你总是有:
if #available(iOS 8.0, *) {
self.alertController = ...
} else
self.alertView = ...
}
如果你只需要在一个函数中使用alert,你可以把你的代码移到函数块中,XCode 7会给出有效的建议。
如果你需要在几个功能块中使用alert并且一遍又一遍地引用同一个alert对象该怎么办?
你可以使用一个新的UIResponder并根据可用性将它向下cast到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的检查。如果你有更好的解决办法,请告诉我。