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

5
我已经在视图控制器中以编程方式添加了一个按钮项:
```html

我已经在视图控制器中以编程方式添加了一个按钮项:

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

现在我想通过编程方式将该工具栏按钮分配给IBOutlet。我应该如何使用Swift实现?

2
IBOutlet 中的 IB 代表 Interface Builder,它表示从界面构建器到源代码的连接。通过编程方式分配 IBOutlet 毫无意义。你到底想做什么? - nhgrif
2个回答

16

IBOutlet的“IB”代表Interface Builder,它表示从界面生成器到源代码的连接。通过编程方式分配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
你的意思是在代码中而不是在IB中为按钮分配一个操作。你的问题表述有些混乱,但没关系。
你可以使用UIBarButtonItem构造函数的targetaction参数。 target是您的控制器,通常是selfaction是一个字符串,表示包含该控制器的按钮处理程序的选择器签名。
    self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain, 
        target: self, action: "buttonHandler:")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接