如何从Swift中的模式视图控制器类调用方法?

时间:2019-03-05 18:50:44

标签: swift

基本上,对于这个简单的游戏应用程序,我有2个不同的UIViewControllers,分别称为ViewController和PreviewController。 PreviewController正在打开带有标题屏幕和标题为“开始游戏”的标签的视图。轻敲标签时,它将启动模式视图控制器(具有实际游戏本身的所有视图的ViewController类),并从设置游戏的ViewController调用“ EnterNewGame”方法。现在,我遇到的问题是调用此方法时,似乎只有一部分方法正在运行。

这是PreviewController中在点击时启动的函数:

@objc func handleButtonTap(_ recognizer: UITapGestureRecognizer) {
    self.present(ViewController(), animated: true, completion: {() -> Void in
        ViewController().enterNewGame()
    })
}

这是ViewController中的EnterNewGame()方法

func enterNewGame() {
    //show suit indicators when starting a new game
    bluePlayerSuitsHidden = false
    redPlayerSuitsHidden = false

    game.blueTurn = true
    self.setBackground()
    self.cleanUpBoard()
    self.createBoard()
    self.displayBoard()
    self.setSuitIndicators()
    self.highlightCards()
    playButton.isEnabled = false
}

现在,点击标签时,屏幕将切换到模式视图控制器,但仅显示黑屏,并且只有其中一个游戏设置(在屏幕顶部设置一些图像)正常工作。我确定EnterNewGame方法可以正常启动游戏,因为我已经对其进行了单独测试,因此我认为我只是没有正确设置模态视图控制器,或者必须以不同的方式调用该方法。谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

要在其上调用方法的控制器与要呈现的控制器不在同一个实例上,需要常量(而且可以通过避免使用self引用和写出{的名称来简化代码) {1}}参数,用于指定闭包的参数和返回类型)

completion

此外,您可以在特定控制器内的其他方法上调用此方法,例如@objc func handleButtonTap(_ recognizer: UITapGestureRecognizer) { let controller = ViewController() present(controller, animated: true) { controller.enterNewGame() } } viewDidLoad,也可以创建工厂方法以返回特定的set控制器。

这最后一部分使我想到:看一下如何实例化控制器,并仔细查看是否不需要通过情节提要或nib文件实例化。

viewWillAppear

用法:

class ViewController: UIViewController {

    class func instantiate() -> ViewController {
        let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Identifier") as! ViewController
        // let controller = ViewController(nibName: "ViewController", bundle: nil)
        controller.enterNewGame()
        return controller
    }

}