我感到很困难,我觉得应该正在工作,我想知道是否有一些事情我不理解初始化IBOutlets的值。
所以我创建了一个有三个IBOutlet的类。然后我为这些出口变量创建了初始化器。当我创建类的新实例并将其传递给硬编码值时,我得到 nil 作为回报。
所以我打印了println()来确定传入的settingLabel值,以确保传入的参数确实带有一个值,它返回为"你好" 如预期的那样。然后我尝试将值分配给 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:
答案 0 :(得分:3)
IBOutlet
关键字只是告诉Xcode视图应该在故事板中可见的一种方法。您可以在故事板中连接这些插座,这样做可以实现变量的实例化。从故事板而不是代码中添加为子视图。
在您的代码中,您是以编程方式创建单元格,而不是从故事板创建单元格(事实上,如果您尝试从故事板创建它们,您的应用程序将崩溃,因为您尚未实现init(coder:)
)。因此,您的变量没有理由成为“出口”并且从未初始化。您必须自己初始化它们,将它们添加为子视图&amp;设置约束,全部在代码中。
在您的初始化程序中,您的代码无效,因为您的变量仍为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 = //...