2017-10-14 92 views
2

我的項目正在使用CircleCI爲單元測試構建,它使用XCode 8。以下代碼崩潰,因爲它使用UIView的屬性safeAreaLayoutGuide,它不存在於iOS 10 SDK中,即使在檢查了iOS 11後也是如此。檢查UIView是否有屬性

if #available(iOS 11, *) { 
     make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
    } 

testViewUIView。我們在這裏添加一個導航欄的約束。有沒有更好的方法來檢查UIView是否有這個特定的屬性? safeAreaLayoutGuide不是Optional

錯誤消息:類型的UIView'的值沒有任何成員 'safeAreaLayoutGuide'

+0

什麼是錯誤信息? – aaron

+0

使用可用性是在Swift中檢查不同平臺的建議方法。如果你在Objective C中,還有其他的,比如檢查對選擇器的響應或SDk中特定類的存在。但在SWIFT的情況下你完全正確並以標準方式使用#available –

+0

@aaron我添加了錯誤消息 – DesperateLearner

回答

0

CircleCI將在if #available(iOS 11, *)構建失敗。我會說你用circle.yml文件升級到XCode 9。在此之前使用視圖的視圖控制器的toplayoutguide。

2

您應該能夠使用respondsToSelector作爲UIView的仍符合NSObjectProtocol:

if testView.responds(to: #selector(safeAreaLayoutGuide)) { 
    make.top.equalTo(testView.safeAreaLayoutGuide.snp.top) 
} 
0

如果您正在使用safeAreaLayoutGuide,您應該只使用Xcode 9+。 因爲safeAreaLayoutGuideUIView屬性被添加在ios11 SDK以上。

if #available(iOS 11, *) { 
    print("for iOS 11 User") 
} else { 
    print("for iOS < 11 user") 
} 

if狀況的上述檢查主要用於那些誰在iOS11 &上else部分的代碼將是誰與較低版本等iOS10運行這些用戶的用戶。

Apple Doc