【问题标题】:Swift: How to dismiss a ViewController programmatically?Swift:如何以编程方式关闭 ViewController?
【发布时间】:2019-11-14 09:10:54
【问题描述】:

我遇到了一个小问题。 在我的主视图控制器上,我有一个条形按钮,可以打开一个幻灯片菜单,这是一个使用幻灯片转换的常规视图控制器。滑动菜单有一个按钮可以打开另一个视图控制器。当新的视图控制器打开时,您可以选择取消,这会关闭当前的视图控制器。问题是,用户再次进入菜单视图,而不是主视图控制器。很高兴知道我做错了什么:)

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")
}

【问题讨论】:

  • 您并没有关闭当前的 MenuViewController,因为您正在创建一个新实例,然后尝试关闭它,即使您实际上并没有呈现它。

标签: swift dismissviewcontroller


【解决方案1】:

考虑

@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. 从此 MenuViewController 实例调用 openSupport(从未关闭)。

归根结底,您想让呈现菜单的主视图控制器进行呈现。所以,菜单视图控制器应该:

  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 视图的人这样做,而不是尝试自己这样做。

【讨论】:

  • @JakobWiemer - 没问题。顺便说一句,如果我回答了你的问题,你可以通过点击它旁边的复选标记来考虑accepting my answer。
【解决方案2】:

你可以简单地通过使用来关闭视图控制器

self.dismiss(animated: true, completion: nil)

【讨论】:

  • 或者只是dismiss(animated: true)。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2015-11-26
  • 2020-07-08
  • 2013-07-04
  • 2010-11-17
相关资源
最近更新 更多