【发布时间】: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 函数?
谢谢。
【问题讨论】: