2015-04-05 4 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

Ах, смешное различие между структурами и классами. Структуры передаются по значению - вся копия создается при каждом присваивании.

Классы, с другой стороны, передаются по ссылке - копии не выполняются при назначении.

В вашем случае два проблемных задания работали нормально, но только локально и никогда не влияли на ваш контроллер.

Используйте class для DiscoverySettings и посмотрите разницу.

+0

Примечание: если вам нужно использовать структуры, вам придется передавать новые значения через закрытие обратного вызова, чтобы контроллер мог назначить (следовательно, скопировать) отредактированную модель в свою собственную копию. –

+0

Я переключил его на «класс», но он все еще отображает начальное значение. Я также переключил «let» на «var» при создании модели. – TIMEX

+0

Если точка останова при двух назначениях, 'dsettings' nil? –

Смежные вопросы