最近,我開始以編程方式學習 UIKit,我注意到撰寫和組織 UI 代碼的不同方法。
第一個是,用閉包宣告一個常量,它將立即執行并回傳某個 UI 元素。
示例(第一種方法):
let mainLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.text = "dummy text..."
//...
return v
}()
第二種是,宣告一個 UI 元素計算 var,它是一個只讀 var,它回傳某個 UI 元素。
示例(第二種方法):
var mainLabel: UILabel {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.text = "dummy text..."
//...
return v
}
第三個是,宣告一個工廠函式來創建 UI 元素,并回傳它。
示例(第三種方法):
private func createMainLabel(with text:String) -> UILabel {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.text = text
//...
return v
}
現在,我假設第 2 和第 3 選項非常相似,每次都創建一個新的 UI 元素實體,第一種方法是只創建一次該元素。但是我想了解是否還有更多內容,為什么我要使用其中一個,什么才是最佳實踐,還有,還有沒有更喜歡的方式來撰寫我在這里沒有提到的 UI 代碼?
uj5u.com熱心網友回復:
第一個是一種常見的方法 - 在我看來 - 一個非常好的方法。您需要了解的有關該 UI 元素的所有資訊都集中在一處。但請注意,如果您需要在此處參考 self,則需要使 UI 元素成為惰性 var,因為在所有屬性(非惰性或可選)初始化之前 self 不可用。例如:
let text = "Hello"
lazy var mainLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.text = self.text // <-- here
//...
return v
}()
第二個對我來說似乎很奇怪。我想不出一個有用的場景。每次訪問變數時,都會處理一個新副本。我認為這至少令人困惑。
當您事先不知道需要多少個 UI 元素實體時,第三個特別有用。
缺少的一種常見方法是這樣的:
let mainLabel = UILabel()
let secondaryLabel = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
mainLabel.translatesAutoresizingMaskIntoConstraints = false
mainLabel.text = "dummy text..."
secondaryLabel.translatesAutoresizingMaskIntoConstraints = false
secondaryLabel.text = "secondary dummy text ..."
// set AutoLayout constraints
}
我認為如果您更喜歡第一種方法或最后一種方法,這主要是一個品味問題。最后一個可以更輕松地一目了然地查看所有屬性,而無需滾動。如果您想了解有關某個 UI 元素的更多資訊,您可以在 viewDidLoad 方法(或您在那里呼叫的一些 setupView() 方法)中看到所有內容,包括其 AutoLayout 約束。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452652.html
