如何使用 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 来做到这一点?
IBOutlet
的IB
代表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
构造函数的 target
和 action
参数。 target
是您的控制器,通常是 self
; action
是一个字符串,它是该控制器包含的按钮处理程序的选择器签名。
self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain,
target: self, action: "buttonHandler:")
我以编程方式向视图控制器添加了一个条形按钮项:
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Menu", style: .Plain, target: nil, action: nil)
}
现在我想以编程方式将该栏按钮项分配给 IBOutlet
。我将如何使用 Swift 来做到这一点?
IBOutlet
的IB
代表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
构造函数的 target
和 action
参数。 target
是您的控制器,通常是 self
; action
是一个字符串,它是该控制器包含的按钮处理程序的选择器签名。
self.someBarButton = UIBarButtonItem(title: "Menu", style: .Plain,
target: self, action: "buttonHandler:")