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