如何在Swift中关闭ViewController?


在Swift中,UIViewController类有一个dismiss方法,可以用来关闭ViewController。此方法使用布尔值作为参数。该参数决定是否应该以动画方式关闭控制器。默认情况下,此方法中的值为true。

以下示例演示如何在Swift中关闭UIViewController屏幕。

第一个视图控制器设置

在此步骤中,我们将设置第一个视图控制器以呈现第二个视图控制器。我们将在第一个视图控制器中添加一个按钮,单击该按钮将呈现目标控制器。

示例

import UIKit
class FirstViewController: UIViewController {
   private let clickButton = UIButton()
   override func viewDidLoad() {
      super.viewDidLoad()
      initialSetup()
   }
   private func initialSetup() {

      // basic setup
      view.backgroundColor = .white
      navigationItem.title = "First Controller"

      // button customization
      clickButton.backgroundColor = .darkGray
      clickButton.setTitle("Go to next controller", for: .normal)
      clickButton.setTitleColor(.white, for: .normal)
      clickButton.layer.cornerRadius = 8
      clickButton.addTarget(self, action: #selector(handleClickButtonTapped), for: .touchUpInside)

      // adding the constraints to the button
      view.addSubview(clickButton)
      clickButton.translatesAutoresizingMaskIntoConstraints = false
      clickButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
      clickButton.widthAnchor.constraint(equalToConstant: 250).isActive = true
      clickButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
      clickButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
   }
       
   @objc private func handleClickButtonTapped() {
      let secondController = SecondViewController()
      self.present(secondController, animated: true)
   }
}

在上面的代码中,我们在控制器的视图中添加了一个按钮来呈现目标控制器。我们对按钮进行了一些基本的自定义以使其外观更好。自定义后,我们向按钮添加了一些必要的约束。

我们的第二个视图控制器在handleClickButtonTapped方法中创建。接下来是带动画的呈现。

第二个视图控制器设置

在此步骤中,我们将使用基本的用户界面设置第二个视图控制器。在此控制器中,我们将在中心添加一个按钮来关闭控制器(self)。

import UIKit
class SecondViewController: UIViewController {
   private let backButton = UIButton()
   override func viewDidLoad() {
      super.viewDidLoad()
      initialSetup()
   }
   private func initialSetup() {

      // basic setup
      view.backgroundColor = .white
      navigationItem.title = "Second Controller"

      // button customization
      backButton.backgroundColor = .darkGray
      backButton.setTitle("Dismiss", for: .normal)
      backButton.setTitleColor(.white, for: .normal)
      backButton.layer.cornerRadius = 8
      backButton.addTarget(self, action: #selector(handleBackButtonTapped), for: .touchUpInside)

      // adding the constraints to the button
      view.addSubview(backButton)
      backButton.translatesAutoresizingMaskIntoConstraints = false
      backButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
      backButton.widthAnchor.constraint(equalToConstant: 200).isActive = true
      backButton.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
      backButton.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
   }
       
   @objc private func handleBackButtonTapped() {
      self.dismiss(animated: true)
   }
}

dismiss方法用于关闭已呈现的视图控制器并导航回已呈现的视图控制器。关闭视图控制器时,您可以指定是否应该以动画方式关闭,并提供一个在关闭完成后执行的完成块。

输出

结论

dismiss方法有两个参数

  • animated − 一个布尔值,决定是否应该以动画方式关闭。

  • completion − 一个可选的闭包,在关闭完成后调用。

通过将true传递给animated参数,您要求父视图控制器以动画方式关闭子视图控制器。completion参数是可选的,可以在关闭完成后用于执行其他任务。

更新于:2023年3月27日

4K+ 次浏览

启动您的职业生涯

完成课程后获得认证

开始学习
广告
© . All rights reserved.