2017-07-25 20 views
0

我看视频系列Swift - 如何使用闭包在视图模型中触发一个函数?

斯威夫特谈#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

正如我理解它,一致视频控制器是“普通”的,视图模型处理所有主要内容,如菜单按钮按下,然后根据需要移动到不同的视图控制器。

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

谢谢。

回答

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) 
} 
相关问题