如何使用Swift以编程方式分配IBOutlet?

Aar*_*ron 4 uinavigationcontroller uibarbuttonitem ios swift

我以编程方式向视图控制器添加了一个条形按钮项:

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil)
}
Run Code Online (Sandbox Code Playgroud)

现在我想以IBOutlet编程方式将该按钮项分配给它.我怎么用Swift做到这一点?

nhg*_*rif 15

所述IBIBOutlet代表覆盖整个院落 uilder和它表示从界面生成器到源代码的连接.以IBOutlet编程方式分配不太合理.

An IBOutlet只是一个类的实例变量,它与接口的一部分相关联,或者可以通过接口构建器设置.如果我们想要一个对我们按钮的引用(如果我们在界面构建器中创建它,我们就会引用它),我们只需在类中添加一个属性,然后将新创建的按钮分配给:

class MyViewController: UIViewController {

    var someBarButton: UIBarButtonItem?

    override func viewDidLoad() {
        super.viewDidLoad()
        self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil)
        self.navigationItem.leftBarButtonItem = self.someBarButton
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,someBarButton是我们的"IBOutlet".


一些笔记......

我们可能实际上并不想以这种方式做事.

这为按钮创建了一个额外的强引用(self.navigationItem已经拥有对它的强引用leftBarButtonItem).

您会注意到,如果您创建了一个IBOutletfrom interface builder,它将被设置为weak属性.那么也许我们想要一个弱势的财产?

但我们实际上可以做得更好.试试这个尺码:

var leftNavBarButton: UIBarButtonItem? {
    get {
        return self.navigationItem.leftBarButtonItem
    }
    set (newValue) {
        self.navigationItem.leftBarButtonItem = newValue
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,self.leftNavBarButton基本上只是一种方便的访问方式self.navigationItem.leftBarButtonItem.