我看視頻系列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函數?
謝謝。