我看视频系列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函数?
谢谢。