检查UIView是否有属性
问题描述:
我的项目正在使用CircleCI为单元测试构建,它使用XCode 8。以下代码崩溃,因为它使用UIView
的属性safeAreaLayoutGuide
,它不存在于iOS 10 SDK中,即使在检查了iOS 11后也是如此。检查UIView是否有属性
if #available(iOS 11, *) {
make.top.equalTo(testView.safeAreaLayoutGuide.snp.top)
}
testView
是UIView
。我们在这里添加一个导航栏的约束。有没有更好的方法来检查UIView是否有这个特定的属性? safeAreaLayoutGuide
不是Optional
。
错误消息:类型的UIView'的值没有任何成员 'safeAreaLayoutGuide'
答
CircleCI将在if #available(iOS 11, *)
构建失败。我会说你用circle.yml文件升级到XCode 9。在此之前使用视图的视图控制器的toplayoutguide。
答
您应该能够使用respondsToSelector作为UIView的仍符合NSObjectProtocol:
if testView.responds(to: #selector(safeAreaLayoutGuide)) {
make.top.equalTo(testView.safeAreaLayoutGuide.snp.top)
}
答
如果您正在使用safeAreaLayoutGuide
,您应该只使用Xcode 9+。 因为safeAreaLayoutGuide
是UIView
属性被添加在ios11 SDK以上。
if #available(iOS 11, *) {
print("for iOS 11 User")
} else {
print("for iOS < 11 user")
}
在if
状况的上述检查主要用于那些谁在iOS11 &上else
部分的代码将是谁与较低版本等iOS10运行这些用户的用户。
什么是错误信息? – aaron
使用可用性是在Swift中检查不同平台的建议方法。如果你在Objective C中,还有其他的,比如检查对选择器的响应或SDk中特定类的存在。但在SWIFT的情况下你完全正确并以标准方式使用#available –
@aaron我添加了错误消息 – DesperateLearner