【问题标题】:Passing data from model to controller将数据从模型传递到控制器
【发布时间】:2019-04-26 17:59:19
【问题描述】:

我想知道当我想将数据从模型传递到控制器时,最佳实践是什么。

我想做的事
我想在时间变化时更新标签。

CurrentTime.swift(模型)

var timer: Timer?
    var currentTime: String?

    init() {
        if timer == nil{
            timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateCurrentTime), userInfo: nil, repeats: true)
        }
    }

    @objc private func updateCurrentTime(){
        let df = DateFormatter()
        df.dateFormat = "HH:mm"
        df.timeZone = TimeZone.current
        let timezoneDate = df.string(from: Date())
        currentTime = timezoneDate
    }

ViewController.swift

class ViewController: UIViewController {

    @IBOutlet var timeLabel: UILabel!
    var currentTime = CurrentTime()

    override func viewDidLoad() {
    }

    @IBAction func closeBtnWasPressed(_ sender: UIButton) {
        dismiss(animated: true, completion: nil)
    }
}

【问题讨论】:

  • 您可以发布Notification 或提供一种在您的模型中注册观察者闭包的方法。您应该将日期格式化程序设置为惰性私有属性,而不是在每次计时器触发时创建它。创建日期格式化程序的成本相对较高。

标签: ios swift model-view-controller


【解决方案1】:

选项 1

1- 添加这个变量

weak var delegate: ViewController?

2-在viewDidLoad的vc

currentTime.delegate = self

3-

let timezoneDate = df.string(from: Date())
currentTime = timezoneDate
delegate?.update(currentTime)

4-在vc里面

func update(_ data:String) {
  lbl.text = data
}

当然可以

delegate?.lbl.text = currentTime

但上面是MVC

选项 2

var ob:NSKeyValueObservation!

viewDidLoad

ob =  currentTime.observe(\CurrentTime.currentTime, options: .new) { cur, tex in
    timeLabel.text = tex
}

【讨论】:

    【解决方案2】:

    你应该像这样定义一个动态类:

    class Dynamic<T> {
    
        var bind: (T) -> Void = { _ in }
    
        var value: T? {
            didSet {
                bind(value!)
            }
        }
    
        init(_ v: T) {
            value = v
        }
    }
    

    在您的模型更改 currentTime 属性的定义中,如下所示:

    var currentTime: Dynamic<String>
    

    在你的控制器中的 viewDidLoad 方法中添加这些代码:

    yourModel.currentTime.bind = { [weak self] time in
      self?.timeLabel.text = time
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 2011-12-21
      • 1970-01-01
      相关资源
      最近更新 更多