避免使用样板代码在viewDidLoad中设置UI

时间:2017-10-15 07:45:22

标签: swift

我只是想知道你是如何使用Swift在IOS开发中正确设置UI的。一般来说,我觉得我需要在视图控制器的viewDidLoad生命周期方法中放置大量语句来自定义UI元素。我知道我可以使用故事板来帮助设置这些UI元素,但有时我们需要以编程方式进行一些调整。这些调整导致viewDidLoad中的巨大和样板代码。 那么,你怎么处理这个?您的扩展仅用于UI部分吗?具体课程?如何清楚地将UI与逻辑分离?

1 个答案:

答案 0 :(得分:2)

为它制作自定义视图!

如果你发现自己写了很多这样的代码:

myView.someProperty1 = someValue1
myView.someProperty2 = someValue2
myView.someProperty3 = someValue3
myView.someProperty4 = someValue4
myView.someProperty5 = someValue5
myView.addSubView(subView1)
myView.addSubView(subView2)
myView.addSubView(subView3)
...

并且您为属性提供的值都独立于视图控制器,可能是创建自定义视图的时间。

以下是一个例子:

为您的视图创建一个xib文件,并将其命名为与自定义视图相同的名称。您将在此处添加自定义视图的子视图以及所需的所有约束。

然后你可以这样做:

@INDesignable // add this if you want to see your view drawn on the storyboard!
class MyCustomView: UIView {
    @IBOutlet var subView1: UIImageView!
    @IBOutlet var subView2: UITextField!
    @IBOutlet var subView3: UIImageView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupView()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupView()
    }

    private func setupView() {
        let view = viewFromNibForClass()
        view.frame = bounds
        view.autoresizingMask = [
            UIViewAutoresizing.flexibleWidth,
            UIViewAutoresizing.flexibleHeight
        ]
        addSubview(view)
        // set up your view here...
        // set all the properties and stuff
    }

    private func viewFromNibForClass() -> UIView {

        let bundle = Bundle(for: MyCustomView.self)
        let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle)
        let view = nib.instantiate(withOwner: self, options: nil).first as! UIView

        return view
    }
}