繁体   English   中英

如何使用初始化程序为IBOutlet分配值?

[英]How do I assign an IBOutlet a value using an Initializer?

我对我觉得应该工作的东西有困难,我想知道是否有一些我不了解初始化IBOutlets值的事情。

所以我创建了一个有三个IBOutlet的类。 然后我为这些出口变量创建了初始化器。 当我创建一个类的新实例并将其传递给硬编码的值时,我得到的是nil

所以我println()'输入的settingLabel值以确保传入的参数确实带有一个值,它返回为“hello”预期。 然后我尝试将值分配给settingsLabel.text ,但是当我调用println(settingsLabel.text)时,它返回为nil

在此输入图像描述 (线程1:EXV_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0))

我的问题是:

我在这里缺少什么和/或如何使用初始化程序为IBOutlet分配值?

这是我对初始化程序的调用:

let cell = SettingCell(settingLabel: "hello", settingSwitch: true, timeSetting: 3)

这是我的SettingCell.swift类:

class SettingCell: UITableViewCell {

    @IBOutlet weak var settingsLabel: UILabel!
    @IBOutlet weak var settingsSwitch: UISwitch!
    @IBOutlet weak var timeSetting: UILabel!

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    init(settingLabel: String, settingSwitch: Bool, timeSetting: NSNumber) {

        println(settingLabel) // returns hello <--------------------

        super.init(style: .Default, reuseIdentifier: "SwitchSettingCell")
        settingsLabel.text = settingLabel
        self.settingsSwitch.on = settingSwitch
        self.timeSetting.text = timeSetting.description as String

        println(settingsLabel.text) // returns nil <--------------------

    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    var cellDelegate: SettingCellDelegate?


    @IBAction func handledSwitchChange(sender: UISwitch) {

        self.cellDelegate?.didChangeSwitchState(sender: self, isOn:settingsSwitch!.on)


    }

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

myStoryboard:

在此输入图像描述

IBOutlet关键字只是告诉Xcode视图应该在故事板中可见的一种方法。 您可以在故事板中连接这些插座,这样做会导致变量被实例化并作为故事板中的子视图而不是代码添加。

在您的代码中,您将以编程方式创建单元格,而不是从故事板创建单元格(事实上,如果您尝试从故事板创建它们,您的应用程序将崩溃,因为您尚未实现init(coder:) )。 因此,您的变量没有理由成为“出口”并且从未初始化。 您必须自己初始化它们,将它们作为子视图和设置约束添加到代码中。

在初始化程序中,您的代码无效,因为您的变量仍nil 实际上,在编辑中,您删除了可选链接? 这将导致应用程序崩溃,因为变量是强制解包的,但是nil 这与println(settingsLabel.text)崩溃的原因相同。


编辑:

好的,所以你的问题是你想从故事板初始化你的单元格,但是你要通过调用自定义初始化程序以编程方式进行。 tableView(_:cellForRowAtIndexPath:) ,通过从重用队列中出列一个来获取单元:

let cell = tableView.dequeueReusableCellWithIdentifier("SettingsCell", forIndexPath: indexPath) as! SettingCell

(这假设您已在故事板中为您的单元格原型提供了标识符“SettingsCell”)

每当从故事板创建视图时,都会使用视图的init(coder:)初始化程序,因此您必须在SettingCell子类中提供此实现。 一旦细胞出列,细胞的出口将被初始化并作为细胞的子视图添加。

因此,在将单元格出列后,您可以设置标签并切换:

cell.settingsLabel.text = //...
cell.settingsSwitch.on = //...
cell.timeSetting.text = //...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM