如何关闭当前的 ViewController 并在 Swift 中转到另一个视图

Posted

技术标签:

【中文标题】如何关闭当前的 ViewController 并在 Swift 中转到另一个视图【英文标题】:How to dismiss the current ViewController and go to another View in Swift 【发布时间】:2015-08-11 22:17:52 【问题描述】:

我是 Swift 新手,我想知道如何关闭当前视图控制器并转到另一个视图。

我的故事板如下所示:MainMenuView -> GameViewController -> GameOverView。我想关闭 GameViewController 以转到 GameOverView,而不是 MainMenuView。

我在 MainMenuView 中使用以下代码:

@IBAction func StartButton(sender: UIButton) 
    let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
    let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("GameViewController") as! GameViewController
    self.presentViewController(nextViewController, animated:true, completion:nil)
    restGame()

在 GameViewController 中,我使用了这段代码,但它不会关闭 GameViewController。

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("GameOverView") as! GameOverView
self.presentViewController(nextViewController, animated:true, completion:nil)

这是我的 GameOverView 代码:

class GameOverView: UIViewController
    // save the presenting ViewController
    var presentingViewController :UIViewController! = self.presentViewController

    override func viewDidLoad() 
        super.viewDidLoad()

    

    @IBAction func ReplayButton(sender: UIButton) 
        restGame()
        didPressClose()
    
    @IBAction func ReturnMainMenu(sender: UIButton) 
        Data.GameStarted = 1
        self.dismissViewControllerAnimated(false) 
            // go back to MainMenuView as the eyes of the user
            self.presentingViewController.dismissViewControllerAnimated(false, completion: nil);
        
       /* let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
        let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("MainScene") as! MainScene
        self.presentViewController(nextViewController, animated:true, completion:nil)*/

    
    func restGame()
        Data.score = 0
        Data.GameHolder = 3
        Data.GameStarted = 1
        Data.PlayerLife = 3.0
        Data.BonusHolder = 30
        Data.BonusTimer = 0
    
    func didPressClose()
    
        self.self.dismissViewControllerAnimated(true, completion:nil)
    
    override func shouldAutorotate() -> Bool 
        return false
    

    deinit
        print("GameOverView is being deInitialized.");

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Release any cached data, images, etc that aren't in use.
    

    override func prefersStatusBarHidden() -> Bool 
        return true
    



有什么建议吗?

【问题讨论】:

【参考方案1】:

你可以做的是让GameOverView被呈现,毕竟当你呈现它时GameViewController在层次结构的下方,然后在你的GameOverView中运行以下代码以在你想要的时候关闭两者关闭GameOverView,如下所示:

@IBAction func ReturnMainMenu(sender: UIButton) 
    // save the presenting ViewController
    var presentingViewController: UIViewController! = self.presentingViewController

    self.dismissViewControllerAnimated(false) 
          // go back to MainMenuView as the eyes of the user
          presentingViewController.dismissViewControllerAnimated(false, completion: nil)
    

当你想关闭GameOverView时,需要调用上面的代码。

希望对你有所帮助。

【讨论】:

它不起作用它给出一个错误“带有Objective-C选择器'presentingViewController'的'presentingViewController'的Getter与具有相同Objective-C选择器的超类'UIViewController'的'presentingViewController'的getter冲突" 我更新了我的帖子,这样你就可以看到我的 GameOverView 代码 首先,函数外的var presentingViewController :UIViewController! = self.presentViewController 不起作用,你需要声明它,然后在你的viewDidLoad 内实例化它。您的问题是,当您将presentingViewController 声明为存储属性时,UIViewController 与他自己的presentingViewController 发生冲突,解决方案:更改名称。上面的代码用于在函数内部调用以避免这种冲突。 感谢帮助它返回 MainMenu,但 GameViewController 没有关闭,内存还没有释放 你说的“还没有关闭内存还没有释放”是什么意思? 当我从 GameViewController 关闭时,内存从 60MB 减少到 40MB,但是如果我从 GameOverView 关闭,内存保持在 60MB,如果我再次玩游戏,内存从 60 增加到 100 MB【参考方案2】:

下面的代码将带你到主 VC,这是一段久经考验的代码。

self.view.window!.rootViewController?.dismiss(animated: false, completion: nil)

【讨论】:

以上是关于如何关闭当前的 ViewController 并在 Swift 中转到另一个视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将第二个viewcontroller文本字段值传递给第一个viewcontroller数组并在swift4中点击按钮时关闭

Swift:关闭在当前上下文中显示图片的 ViewController 时不时冻结屏幕

关闭一个 ViewController 并在 iOS 中启动另一个(不是重复的,其他答案不起作用)

错误 - (void)reloadData [关闭]

模态viewController关闭按钮问题

关闭呈现 viewController 不起作用并出现警告消息