懒惰var或让UIButton

时间:2016-01-31 04:17:18

标签: ios swift

当我想在视图控制器的视图中添加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
    }()

我的问题是我应该使用哪种方式或哪种方式更好?

  1. 我不喜欢第一种方式,因为我必须添加额外的方法来配置其他属性。

  2. 第二个对我没问题,我只需要在任何地方打电话button

  3. 我认为使用let是最合适的,所以我使用第三种方式,但问题是我无法调用self,如果我在闭包中添加此链接: / p>

    button.addTarget(self,action:" connect",forControlEvents:UIControlEvents.TouchUpInside)

  4. 我收到了错误:

    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];
       ...
    }
    

1 个答案:

答案 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()
}

然后,您可以更好地专注于您的功能,并且您的代码保持井井有条。