ios - UIKit 以编程方式 : Help on different approaches when writing UI Code

标签 ios swift uikit

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

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

示例(第一种方法):

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

第二个是,声明一个 UI 元素计算变量,它是一个返回某个 UI 元素的只读 var。

示例(第二种方法):

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 约束。

关于ios - UIKit 以编程方式 : Help on different approaches when writing UI Code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71667039/

相关文章:

ios - 在 Swift 4 中获取远程通知设备 token ?

ios - 将数据从 Swift View Controller 传递到 Objective-C View Controller

ios - iOS Playgrounds 是否支持 UIView 动画?

ios - 附加PathComponent后路径不同(_ :)

ios - NSTextStorage 里面有长文本。表现

ios - UIView instanceFromNib() 函数

swift - 如何忽略 URL 中的参数?

Swift 子字符串在反转时崩溃(需要一个原因)

ios - 自定义 Controller 包含和导航栏高度

objective-c - numberOfSectionsInTableView 之后 UITableViewController 崩溃