我在某些我认为应该可以工作的事情上遇到了困难,我想知道关于初始化IBOutlets的值是否有些我不了解的事情。
因此,我创建了一个包含三个IBOutlet的类。然后,我为这些出口变量创建了初始化程序。当我创建该类的新实例并将其传递给硬编码的值时,我得到的回报为零。
因此,我已经对传入的settingLabel值进行了println()处理,以确保传入的参数确实包含一个值,按预期它会返回“ 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
。实际上,在您的编辑中,您删除了可选的chaining ?
,这将使您的应用程序崩溃,因为这些变量是强制展开的,但是是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 = //...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句