UIKit程序化:帮助编写UI代码时采用不同的方法



最近,我开始以编程方式学习UIKit,并注意到编写和组织UI代码的不同方法。

第一个是,用闭包声明一个常量,它将立即执行并返回某个UI元素。

示例(第一种方法(:

let mainLabel: UILabel = {
let v = UILabel()
v.translatesAutoresizingMaskIntoConstraints = false
v.text = "dummy text..."
//...
return v
}()

第二个是,声明一个UI元素computed 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
}

现在,我假设第二个和第三个选项非常相似,每次都创建一个新的UI元素实例,而第一种方法是只创建一次该元素。但我想知道,如果还有更多,为什么我会使用一种而不是另一种,什么才是最佳实践,还有,有没有我在这里没有提到的更喜欢的编写UI代码的方法?

第一个是一种常见的方法,在我看来是一种非常好的方法。您需要了解的关于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 ..."
// build view hierarchy
// set AutoLayout constraints
}

我认为这主要取决于你是喜欢第一种方法还是最后一种方法。最后一个使您无需滚动即可一目了然地查看所有属性。如果您想了解某个UI元素的更多信息,可以在viewDidLoad方法(或您在其中调用的一些setupView((方法(中查看所有内容,包括其AutoLayout约束。

相关内容

  • 没有找到相关文章