【问题标题】:Swift - How to use a closure to fire a function in a view model?Swift - 如何使用闭包来触发视图模型中的函数?
【发布时间】:2017-07-25 15:55:40
【问题描述】:

我正在看视频系列

斯威夫特谈话#5 连接视图控制器 网址:https://talk.objc.io/episodes/S01E05-connecting-view-controllers

在这个视频系列中,他们删除了所有 prepareForSegue 并使用 App 类来处理不同视图控制器之间的连接。

我想复制这个,但特别是在我当前的视图模型中;但我没有得到的是如何通过视图模型连接视图控制器(或者即使你打算这样做)

在他们的代码中,在 github:https://github.com/objcio/S01E05-connecting-view-controllers/blob/master/Example/AppDelegate.swift

他们在他们的视图控制器中使用这样做

var didSelect: (Episode) -> () = { _ in }

运行;

func showEpisode(episode: Episode) {
        let detailVC = storyboard.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        detailVC.episode = episode
        navigationController.pushViewController(detailVC, animated: true)
    }

以同样的方式,我想使用我的 ViewController 来使用我的 ViewModel 来按下菜单按钮(依赖标签)。

我的代码如下;

struct MainMenuViewModel {
    enum MainMenuTag: Int {
        case newGameTag = 0
    }

    func menuButtonPressed(tag: Int) {
        guard let tagSelected = MainMenuTag.init(rawValue: tag) else {
            return
        }
        switch tagSelected {
        case .newGameTag:
            print ("Pressed new game btn")
            break
        }
    }

    func menuBtnDidPress(tag: Int) {
        print ("You pressed: \(tag)")
        // Do a switch here 
        // Go to the next view controller?  Should the view model even know about navigation controllers, pushing, etc?
    }
}

class MainMenuViewController: UIViewController {

    @IBOutlet var mainMenuBtnOutletCollection: [UIButton]!

    var didSelect: (Int) -> () = { _ in }

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func mainMenuBtnPressed(_ sender: UIButton) {
        let tag = (sender).tag
        self.didSelect(tag)

    }
}

我不明白的是如何连接命令

self.didSelect(tag)

到函数

func menuButtonPressed(tag: Int)

在我的 ViewModel 中

据我了解,根据 swift talk 视频,其想法是视图控制器是“普通”的,并且视图模型处理所有主要内容,例如按下菜单按钮,然后移动到不同的视图控制器必要的。

如何将 didSelect 项连接到我的 viewModel 函数?

谢谢。

【问题讨论】:

    标签: swift mvvm closures


    【解决方案1】:

    您应该为您的控制器设置didSelect 属性,如下所示:

    func showEpisode(episode: Episode) {
        let detailVC = storyboard.instantiateViewControllerWithIdentifier("Detail") as! DetailViewController
        detailVC.episode = episode
        detailVC.didSelect = { episode in 
           // do whatever you need
           // for example dismiss detailVC
           self.navigationController.popViewController(animated: true)
           // or call the model methods
           self.model.menuButtonPressed(episode)
        }
        navigationController.pushViewController(detailVC, animated: true)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多