我有一个班级:
class DiscoverySettings {
var alert:Bool
var distance:Int
var minAge: Int
var maxAge: Int
private init(){
alert = true
distance = 50
minAge = 18
maxAge = 25
}
}
在另一个控制器中,我这样做:
var discovery_model = DiscoverySettings()
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == Constants.EditDiscoverSegue {
if let dseg = segue.destinationViewController.contentViewController as? DiscoverySettingsViewController {
dseg.dsettings = discovery_model
}
}
}
这是我在updateUI()中进行初始设置的地方:
@IBOutlet weak var distanceSlider: UISlider!
@IBOutlet weak var alertSwitch: UISwitch!
var dsettings: DiscoverySettings? {
didSet{
updateUI()
}
}
let ageSlider = RangeSlider(frame: CGRectZero)
override func viewDidLoad() {
super.viewDidLoad()
}
func updateUI(){
self.distanceSlider.value = Float(dsettings?.distance) //error
self.alertSwitch = dsettings?.alert //error
}
我在设置值的行上遇到错误,例如“找不到接受提供的参数的init的重载”和“找不到重载NSNumber不是UISwitch的子类型”。
我不确定为什么会发生这些错误,因为我在班上将类型定义为相同。
答案 0 :(得分:2)
请尝试以下代码:
func updateUI(){
if let dsettings = dsettings {
self.distanceSlider?.value = Float(dsettings.distance)
self.alertSwitch?.on = dsettings.alert
}
}
答案 1 :(得分:0)
我发现您提供的代码有两个问题:
1。:在prepareForSegue上,当你设置contentViewController的settings属性时,segue的目标视图控制器的视图尚未加载,你在didSet上调用updateUI。这是导致错误的原因:
“致命错误:在打开Optional时意外发现nil 值“
因为此时视图仍为零,并且您自动展开属性定义中的可选项,因为您使用“!”。
您应该将对updateUI()的调用移至viewDidLoad,或者您必须检查是否已创建视图
2.a:你需要做的事情是“如果让dsettings”,那就是Float()不接受一个可选项,并且使用if if使得在if范围内dsettings不再是可选的。