当我想在视图控制器的视图中添加UIButton
时,可以采用以下方法:
第一
let button: UIButton = UIButton()
然后在viewDidLoad
方法中配置属性。
第二
lazy var button: UIButton = {
let buttonTemp = UIButton()
buttonTemp.backgroundColor = UIColor.clearColor()
button.addTarget(self, action: "connect", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(buttonTemp)
return buttonTemp
}()
第三
let button: UIButton = {
let button = UIButton(type: .Custom)
button.backgroundColor = UIColor.greenColor()
return button
}()
我的问题是我应该使用哪种方式或哪种方式更好?
我不喜欢第一种方式,因为我必须添加额外的方法来配置其他属性。
第二个对我没问题,我只需要在任何地方打电话button
。
我认为使用let是最合适的,所以我使用第三种方式,但问题是我无法调用self
,如果我在闭包中添加此链接: / p>
button.addTarget(self,action:" connect",forControlEvents:UIControlEvents.TouchUpInside)
我收到了错误:
ViewController.swift:24:26: Cannot convert value of type 'NSObject -> () -> ViewController' to expected argument type 'AnyObject?'
所以我在这个闭包中添加了这一行(self
的任何一行)。有什么方法可以解决这个问题吗?
总结,哪种方式更好还是更合适?还是更好的方式?谢谢!
修改:
当我使用Objective C时,我喜欢以这种方式使用getter
- (UIButton *) button {
if (!_button) {
_button = [[UIButton alloc] init];
_button.backgroundColor = [UIColor redColor];
...
}
return _button;
}
所以我的viewDidLoad
会很干净,看起来不错:
- (void) viewDidLoad {
...
[self.view addSubview:self.button];
...
}
答案 0 :(得分:1)
样式明显不同,但在我工作的地方,我们已采用以下方法进行标准化:
class ViewController: UIViewController {
private var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
button = {
let button = UIButton(type: .Custom)
button.addTarget(self, action: "buttonTouched:", forControlEvents: .TouchUpInside)
button.otherProperty = ...
return button
}()
view.addSubview(button)
// add constraints for button
}
func buttonTouched(sender: UIButton) {
print("boop")
}
}
您所有方法的问题在于:
self
使用上面的方法(使用强制解包的可选),你可以获得延迟初始化的好处(即所有事情都发生在viewDidLoad()
),你知道因为你拥有button
永远不会的对象是nil
(因此您不必在整个地方使用条件绑定),并且您可以在一个位置包含所有UIView
属性的初始化。
您显然可以(并且我们确实)使您的viewDidLoad()
函数看起来像这样:
override func viewDidLoad() {
super.viewDidLoad()
createViews()
addSubviews()
addViewConstraints()
}
然后,您可以更好地专注于您的功能,并且您的代码保持井井有条。