使用 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
有效,但展开转场是另一种选择。
正在学习一些视图控制器基础知识,并且一直在研究如何使用按钮关闭模态框。
在我精简的示例中,我有两个视图设置,其中包含初始视图和模态视图。第一个视图有一个成功弹出模式的按钮。在模式上,有一个应该自行关闭的按钮。
根据
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
有效,但展开转场是另一种选择。