基本上,对于这个简单的游戏应用程序,我有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方法可以正常启动游戏,因为我已经对其进行了单独测试,因此我认为我只是没有正确设置模态视图控制器,或者必须以不同的方式调用该方法。谢谢您的帮助。
答案 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
}
}