Swift:如何以编程方式关闭ViewController?

时间:2019-07-03 16:05:26

标签: swift dismissviewcontroller

我有一个小问题。 在我的主视图控制器上,我获得了一个条形按钮,用于打开幻灯片菜单,这是一个使用幻灯片过渡的常规视图控制器。幻灯片菜单上有一个按钮可以打开另一个视图控制器。当打开新的视图控制器时,您可以选择取消,这将取消当前的视图控制器。问题是,用户再次出现在菜单视图中,而不是主视图控制器中。很高兴知道我在做什么错:)

func openSupport() {
    guard  let creditViewContoller = storyboard?.instantiateViewController(withIdentifier: "support") as? CreditViewController else { return }
    present(creditViewContoller, animated: true)
}

@IBAction func buttonSupport(_ sender: UIButton) {
    let menuView = MenuViewController()
    menuView.dismiss(animated: true, completion: nil)
    openSupport()
    print("Tap on Support")
}

2 个答案:

答案 0 :(得分:1)

您只需使用

即可关闭视图控制器
self.dismiss(animated: true, completion: nil)

答案 1 :(得分:0)

考虑

@IBAction func buttonSupport(_ sender: UIButton) {
    let menuView = MenuViewController()               // (1)
    menuView.dismiss(animated: true, completion: nil) // (2)
    openSupport()                                     // (3)
    print("Tap on Support")
}

此:

  1. 创建新的MenuViewController,但从不显示;
  2. 在从未显示过的视图控制器上调用dismiss;和
  3. 从此openSupport实例调用MenuViewController(从未关闭过)。

最底下的是,您想让呈现菜单的主视图控制器进行呈现。因此,菜单视图控制器应:

  1. 为其定义一个协议,以通知正在呈现的视图控制器过渡到下一个场景:

    protocol MenuViewControllerDelegate: class {
        func menu(_ menu: MenuViewController, present viewController: UIViewController)
    }
    
  2. 然后,菜单视图控制器关闭后,就可以告诉其委托者应该显示的内容:

    class MenuViewController: UIViewController {
        weak var delegate: MenuViewControllerDelegate?
    
        @IBAction func didTapSupport(_ sender: Any) {
            dismiss(animated: true) {
                guard let controller = self.storyboard?.instantiateViewController(withIdentifier: "support") else { return }
                self.delegate?.menu(self, present: controller)
            }
        }
    
        @IBAction func didTapCancel(_ sender: Any) {
            dismiss(animated: true)
        }
    }
    

然后,主视图控制器需要

  1. 确保设置菜单视图控制器的delegate

    class ViewController: UIViewController {
        override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
            if let destination = segue.destination as? MenuViewController {
                destination.delegate = self
            }
        }
    }
    

  2. 确保提供菜单控制器要求它的视图控制器:

    extension ViewController: MenuViewControllerDelegate {
        func menu(_ menu: MenuViewController, present viewController: UIViewController) {
            present(viewController, animated: true)
        }
    }
    

有很多实现此目的的方法,因此请不要在这里迷失方向。但想法是要有一个系统,菜单视图控制器可以通过该系统请求呈现support视图的人这样做,而不是自己尝试。