如何使用 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 来做到这一点?

【问题讨论】:

IBOutletIB 代表 Interface Builder,它表示从接口构建器到源代码的连接。以编程方式分配IBOutlet 意义不大。你实际上想做什么? 【参考方案1】:

IBOutletIB 代表 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 构造函数的targetaction 参数。 target 是你的控制器,通常是 selfaction 是一个字符串,它是该控制器包含的按钮处理程序的选择器签名。

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

【讨论】:

以上是关于如何使用 Swift 以编程方式分配 IBOutlet?的主要内容,如果未能解决你的问题,请参考以下文章

Swift 以编程方式设置文本字段的占位符

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

如何使用 Swift 以编程方式创建 UILabel?

如何使用 Swift 以编程方式添加约束

在 Swift 中以编程方式设置动作监听器

如何使用 Swift 以编程方式使用交替条纹图案填充 UIView?