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

时间:2015-05-07 21:59:36

标签: ios swift uinavigationcontroller uibarbuttonitem

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

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

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

2 个答案:

答案 0 :(得分:15)

IB IBOutlet代表 nterface B uilder,它代表从界面构建器到源代码的连接。以编程方式分配IBOutlet的意义不大。

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

现在,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的便捷方式。

答案 1 :(得分:1)

您的意思是在代码中而不是在IB中为按钮指定操作。你的问题措辞有些令人困惑,但没关系。

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

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