Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ViewModel调用ViewController方法MVVM模式,而不创建委托Swift_Swift - Fatal编程技术网

ViewModel调用ViewController方法MVVM模式,而不创建委托Swift

ViewModel调用ViewController方法MVVM模式,而不创建委托Swift,swift,Swift,我使用的是MVVM设计模式,当currentStatus属性更新时,我想调用SettingsViewController方法 有没有一种方法可以在不创建委托或其他更好的方法的情况下实现 设置模式swift var currentStatus: String? { get { return UserDefaults.standard.string(forKey: KeyValuePair.selectedStatus) } set { UserDef

我使用的是MVVM设计模式,当currentStatus属性更新时,我想调用SettingsViewController方法

有没有一种方法可以在不创建委托或其他更好的方法的情况下实现

设置模式swift

var currentStatus: String? {
    get {
      return UserDefaults.standard.string(forKey: KeyValuePair.selectedStatus)
    }
    set {
      UserDefaults.standard.set(newValue, forKey: KeyValuePair.selectedStatus)
      updateStatus()
    }
  }
var settingVM : SettingsModel 

func updateStatus () {
}
class Box<T> {
  typealias Listener = T -> Void
  var listener: Listener?

  var value: T {
    didSet {
      listener?(value)
    }
  }

  init(_ value: T) {
    self.value = value
  }

  func bind(listener: Listener?) {
    self.listener = listener
    listener?(value)
  }
}
var yourPickerValue: Box<String?> = Box(nil)
private var yourUptatedValue: String
private var settingVM : SettingsModel()

settingVM.yourPickerValue.bind { [unowned self] in // or [weak self]
    self.yourUpdatedValue = $0
    UserDefaults.standard.string($0, forKey: KeyValuePair.selectedStatus)
}
设置模型视图控制器.swift

var currentStatus: String? {
    get {
      return UserDefaults.standard.string(forKey: KeyValuePair.selectedStatus)
    }
    set {
      UserDefaults.standard.set(newValue, forKey: KeyValuePair.selectedStatus)
      updateStatus()
    }
  }
var settingVM : SettingsModel 

func updateStatus () {
}
class Box<T> {
  typealias Listener = T -> Void
  var listener: Listener?

  var value: T {
    didSet {
      listener?(value)
    }
  }

  init(_ value: T) {
    self.value = value
  }

  func bind(listener: Listener?) {
    self.listener = listener
    listener?(value)
  }
}
var yourPickerValue: Box<String?> = Box(nil)
private var yourUptatedValue: String
private var settingVM : SettingsModel()

settingVM.yourPickerValue.bind { [unowned self] in // or [weak self]
    self.yourUpdatedValue = $0
    UserDefaults.standard.string($0, forKey: KeyValuePair.selectedStatus)
}

如果您不想在MVVM设计模式中使用协议,我认为创建一个Box类并使用泛型会很好

比如说,

Box.swift

var currentStatus: String? {
    get {
      return UserDefaults.standard.string(forKey: KeyValuePair.selectedStatus)
    }
    set {
      UserDefaults.standard.set(newValue, forKey: KeyValuePair.selectedStatus)
      updateStatus()
    }
  }
var settingVM : SettingsModel 

func updateStatus () {
}
class Box<T> {
  typealias Listener = T -> Void
  var listener: Listener?

  var value: T {
    didSet {
      listener?(value)
    }
  }

  init(_ value: T) {
    self.value = value
  }

  func bind(listener: Listener?) {
    self.listener = listener
    listener?(value)
  }
}
var yourPickerValue: Box<String?> = Box(nil)
private var yourUptatedValue: String
private var settingVM : SettingsModel()

settingVM.yourPickerValue.bind { [unowned self] in // or [weak self]
    self.yourUpdatedValue = $0
    UserDefaults.standard.string($0, forKey: KeyValuePair.selectedStatus)
}

如果您不想在MVVM设计模式中使用协议,我认为创建一个Box类并使用泛型会很好

比如说,

Box.swift

var currentStatus: String? {
    get {
      return UserDefaults.standard.string(forKey: KeyValuePair.selectedStatus)
    }
    set {
      UserDefaults.standard.set(newValue, forKey: KeyValuePair.selectedStatus)
      updateStatus()
    }
  }
var settingVM : SettingsModel 

func updateStatus () {
}
class Box<T> {
  typealias Listener = T -> Void
  var listener: Listener?

  var value: T {
    didSet {
      listener?(value)
    }
  }

  init(_ value: T) {
    self.value = value
  }

  func bind(listener: Listener?) {
    self.listener = listener
    listener?(value)
  }
}
var yourPickerValue: Box<String?> = Box(nil)
private var yourUptatedValue: String
private var settingVM : SettingsModel()

settingVM.yourPickerValue.bind { [unowned self] in // or [weak self]
    self.yourUpdatedValue = $0
    UserDefaults.standard.string($0, forKey: KeyValuePair.selectedStatus)
}

我的想法是通过通知而不是回调来处理它,视图控制器监听状态更改。这可能取决于当前状态“set”来自何处。您能举个例子吗
currentStatus
来自SettingsViewController中的picker,我的诱惑是通过通知而不是回调来处理它,视图控制器监听状态更改。这可能取决于当前状态“set”来自何处。您能举个例子吗<代码>当前状态来自设置视图控制器中的选择器