2015-04-05 82 views
0

首先,我有一个结构。这是我的模型我的模型怎么没有更新?

struct DiscoverySettings { 
    var alert:Bool 
    var distance:Int 
    var minAge: Int 
    var maxAge: Int 
    private init(){ 
     alert = true 
     distance = 50 
     minAge = 18 
     maxAge = 100 
    } 
} 

extension UIViewController{ 
    var contentViewController: UIViewController{ 
     if let navcon = self as? UINavigationController{ 
      return navcon.visibleViewController 
     }else{ 
      return self 
     } 
    } 
} 

// View Controller 1 
class SettingsViewController: UIViewController { 
    let 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 
      } 
     } 
    } 
    @IBAction func unwindToSettings(segue:UIStoryboardSegue){ 
     println(discovery_model.minAge) 
     println(discovery_model.maxAge) 
    } 
... 

//View Controller 2 
class DiscoverySettingsViewController: UIViewController { 

    var dsettings: DiscoverySettings? { 
     didSet{ 
      render() 
     } 
    } 

    func rangeSliderValueChanged(rangeSlider: RangeSlider) { 
     println("Range slider value changed: (\(Int(rangeSlider.lowerValue)) , \(Int(rangeSlider.upperValue)))") 
     var low = Int(rangeSlider.lowerValue) 
     var high = Int(rangeSlider.upperValue) 
     dsettings?.minAge = low //this does not set the original model! 
     dsettings?.maxAge = high //this does not set the original model! 
    } 
... 

当拖动滑块,然后单击“保存”放松原点SEGUE,我打印出来的最大年龄和最小年龄。但是,它们打印18和100.它们不打印我在滑块中更改的值。 (但是,打印语句都工作,所以滑块工作正常)。

回答

0

啊,结构和类之间有趣的区别。结构体按值传递 - 每个赋值都会创建一个完整的副本。

另一方面,类通过引用传递 - 没有作业的副本。

在你的情况下,两个令人烦恼的任务可以正常工作,但只能在本地使用,并且不会影响控制器。

使用classDiscoverySettings并查看区别。

+0

但是,如果您需要使用结构,则必须通过回调闭包传递新值,以便控制器可以将编辑后的模型分配(因此复制)到其自己的副本中。 – 2015-04-05 09:13:23

+0

我将它切换到“class”,但仍显示初始值。创建模型时,我也将“let”改为“var”。 – TIMEX 2015-04-05 09:16:04

+0

如果你在这两个任务中断点,是'dsettings'零? – 2015-04-05 09:26:54