如何使用 Swift 以编程方式分配 IBOutlet?
Posted
技术标签:
【中文标题】如何使用 Swift 以编程方式分配 IBOutlet?【英文标题】:How do you assign an IBOutlet programmatically using Swift? 【发布时间】:2015-05-07 21:59:35 【问题描述】:我以编程方式向视图控制器添加了一个条形按钮项:
override func viewDidLoad()
super.viewDidLoad()
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil)
现在我想以编程方式将该栏按钮项分配给IBOutlet
。我将如何使用 Swift 来做到这一点?
【问题讨论】:
IBOutlet
的 IB
代表 Interface Builder,它表示从接口构建器到源代码的连接。以编程方式分配IBOutlet
意义不大。你实际上想做什么?
【参考方案1】:
IBOutlet
的 IB
代表 Ininterface 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
的便捷方式。
【讨论】:
【参考方案2】:您的意思是在代码中而不是在 IB 中为按钮分配一个动作。您的问题措辞有些混乱,但没关系。
您使用UIBarButtonItem
构造函数的target
和action
参数。 target
是你的控制器,通常是 self
; action
是一个字符串,它是该控制器包含的按钮处理程序的选择器签名。
self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain,
target: self, action: "buttonHandler:")
【讨论】:
以上是关于如何使用 Swift 以编程方式分配 IBOutlet?的主要内容,如果未能解决你的问题,请参考以下文章