使用 Swift 中的按钮关闭模态视图?

Close a modal view with a button in Swift?

正在学习一些视图控制器基础知识,并且一直在研究如何使用按钮关闭模态框。

在我精简的示例中,我有两个视图设置,其中包含初始视图和模态视图。第一个视图有一个成功弹出模式的按钮。在模式上,有一个应该自行关闭的按钮。

根据 posts 和文档,我应该能够 运行 像这样将简单的代码附加到按钮上:

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func CloseModal(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }

}

当我点击 "Close Modal" 按钮时,没有任何反应。我在这里错过了什么?我把这段代码放错地方了吗?目前,它位于 ViewController.swift 主文件中。

您实际上有两个 ViewController 屏幕,但看起来您只有一个 ViewController class?第二个屏幕是否连接到 class?

必须在closeModal方法属于副屏的class

//This is First ViewController, OpenModal Button is here
class ViewController: UIViewController {

  override func viewDidLoad() {
     super.viewDidLoad()
  }

}


// The name of the class and the Viewcontroller in the storyboard have to be the same, and CloseModol Button and function need to be here 
class SecondViewController: UIViewController {

  override func viewDidLoad() {
     super.viewDidLoad()
  }

  @IBAction func CloseModal(_ sender: Any) {
     self.dismiss(animated: true, completion: nil)
  } 

}

不要忘记在 Storyboad 中设置 ViewController 的名称; 从第一个ViewController到第二个ViewController

另一种方法是对主视图控制器使用 unwind segue。只需在第一个视图控制器中添加一个“展开操作”:

class ViewController: UIViewController {

    @IBAction func unwindHome(_ segue: UIStoryboardSegue) {
        // this is intentionally blank
    }

}

只需为这个展开操作起一个有意义的名称,在本例中为 unwindHome,这样,如果以后有多个展开操作,您就可以轻松区分它们。

然后你可以控制-从第二个场景中的按钮拖到“退出”控件和select适当的展开动作:

这有几个不错的方面:

  • “关闭”按钮不再关心您如何呈现它,它会在适当的情况下展开(例如,如果您稍后将初始转场更改为 show/push 转场,则展开无需任何代码更改,segue 仍然可以工作。

  • 因为您现在正在使用 segue 放松,呈现的视图控制器可以使用其 prepare(for:sender:) 发送回数据,如果您最终需要这样做的话。

  • 如果需要,您可以展开多个场景。例如,如果 A 呈现 B,B 呈现 C,您显然可以从 C 放松到 B,但如果您愿意,您也可以从 C 一直放松到 A。

因此,虽然 dismiss 有效,但展开转场是另一种选择。