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

How do you assign an IBOutlet programmatically using Swift?

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

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

现在我想以编程方式将该栏按钮项分配给 IBOutlet。我将如何使用 Swift 来做到这一点?

IBOutletIB代表I接口Builder,它代表来自源代码的界面生成器。以编程方式分配 IBOutlet 意义重大。

IBOutlet 只是一个 class 的实例变量,它绑定到界面的一部分,或者可以通过界面构建​​器设置。如果我们想要引用我们的按钮(如果我们在界面构建器中创建它,我们将以同样的方式引用它),我们只需添加一个 属性 到我们的 class,然后将我们新创建的按钮分配给它:

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
    }
}

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


一些笔记...

很有可能我们实际上不想以这种方式做事。

这会创建对按钮的额外强引用(self.navigationItem 已经拥有对其 leftBarButtonItem 的强引用)。

您会注意到,如果您从界面生成器创建 IBOutlet,它会设置为 weak 属性。所以也许我们想要一个弱 属性?

但实际上我们可以做得更好。试穿尺码:

var leftNavBarButton: UIBarButtonItem? {
    get {
        return self.navigationItem.leftBarButtonItem
    }
    set (newValue) {
        self.navigationItem.leftBarButtonItem = newValue
    }
}

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

您的意思是在代码中而不是在 IB 中为按钮分配一个动作。您的问题措辞有些混乱,但没关系。

您使用 UIBarButtonItem 构造函数的 targetaction 参数。 target 是您的控制器,通常是 selfaction 是一个字符串,它是该控制器包含的按钮处理程序的选择器签名。

    self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain, 
        target: self, action: "buttonHandler:")