在模态视图控制器后面更改视图控制器
Changing View Controllers Behind a Modal View Controller
我想为通讯录应用程序创建类似于 done/edit 页面的内容。模态视图背后的视图似乎发生了变化,但我不确定它是如何产生这种行为的。
这是我目前看过的内容:
iOS: Switch view controller behind current modal view controller? 看来这个post 的答案是正确的。但是,我不确定他所说的 making the root view controller a delegate of the modal view
和 call a delegate method
.
是什么意思
这是我想要完成的:
想象一个嵌入导航控制器的 vc1。我在 vc1 上点击一个按钮,这会导致 vc2 以模态方式呈现。当您在 vc2 上按 "Done" 时,它会关闭模态视图 vc2,并显示 vc3。当您点击 vc3 上的后退按钮时,它会返回到 vc1。
这是当前行为:
我可以让 vc2 以模态方式显示在 vc1 之上。但是当在 vc2 上按下 "Done" 按钮时,它只是返回到 vc1 而不是转到 vc3 然后,当点击 "Back" 时,转到 vc1.
这是我已经尝试过的方法:
我尝试在没有动画的情况下从 vc1 转到 vc3,然后模态地转到 v2。这种类型的转换非常难看,它会导致显示此 Presenting view controllers on detached view controllers is discouraged
错误。此外,我尝试了 unwindToSegue
方法的不同组合,但我也无法弄清楚。
如有任何帮助,我们将不胜感激!非常感谢您的宝贵时间:)
您通过在 vc1 中创建协议并将其作为模态视图控制器的 属性,使根视图控制器 (vc1) 成为模态视图控制器的委托。当您关闭模态视图控制器时,调用委托方法之一。这样的东西可能对你有用:
vc1:
protocol Vc1Delegate: class {
func pushToVc3()
}
class Vc1: UIViewController, Vc1Delegate
{
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Vc2Modal" {
if let _vc2 = segue.destinationViewController as? Vc2 {
_vc2.delegate = self
}
}
}
@IBAction func showVc2Modal() {
performSegueWithIdentifier("Vc2Modal", sender: nil)
}
// MARK: Vc1Delegate
func pushToVc3() {
performSegueWithIdentifier("Vc3PushWithoutAnimation", sender: nil)
}
}
Vc2:
class Vc2: UIViewController
{
weak var delegate: Vc1Delegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func dismiss() {
delegate?.pushToVc3()
dismissViewControllerAnimated(true, completion: nil)
}
}
我想为通讯录应用程序创建类似于 done/edit 页面的内容。模态视图背后的视图似乎发生了变化,但我不确定它是如何产生这种行为的。
这是我目前看过的内容:
iOS: Switch view controller behind current modal view controller? 看来这个post 的答案是正确的。但是,我不确定他所说的 making the root view controller a delegate of the modal view
和 call a delegate method
.
这是我想要完成的:
想象一个嵌入导航控制器的 vc1。我在 vc1 上点击一个按钮,这会导致 vc2 以模态方式呈现。当您在 vc2 上按 "Done" 时,它会关闭模态视图 vc2,并显示 vc3。当您点击 vc3 上的后退按钮时,它会返回到 vc1。
这是当前行为:
我可以让 vc2 以模态方式显示在 vc1 之上。但是当在 vc2 上按下 "Done" 按钮时,它只是返回到 vc1 而不是转到 vc3 然后,当点击 "Back" 时,转到 vc1.
这是我已经尝试过的方法:
我尝试在没有动画的情况下从 vc1 转到 vc3,然后模态地转到 v2。这种类型的转换非常难看,它会导致显示此 Presenting view controllers on detached view controllers is discouraged
错误。此外,我尝试了 unwindToSegue
方法的不同组合,但我也无法弄清楚。
如有任何帮助,我们将不胜感激!非常感谢您的宝贵时间:)
您通过在 vc1 中创建协议并将其作为模态视图控制器的 属性,使根视图控制器 (vc1) 成为模态视图控制器的委托。当您关闭模态视图控制器时,调用委托方法之一。这样的东西可能对你有用:
vc1:
protocol Vc1Delegate: class {
func pushToVc3()
}
class Vc1: UIViewController, Vc1Delegate
{
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Vc2Modal" {
if let _vc2 = segue.destinationViewController as? Vc2 {
_vc2.delegate = self
}
}
}
@IBAction func showVc2Modal() {
performSegueWithIdentifier("Vc2Modal", sender: nil)
}
// MARK: Vc1Delegate
func pushToVc3() {
performSegueWithIdentifier("Vc3PushWithoutAnimation", sender: nil)
}
}
Vc2:
class Vc2: UIViewController
{
weak var delegate: Vc1Delegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
@IBAction func dismiss() {
delegate?.pushToVc3()
dismissViewControllerAnimated(true, completion: nil)
}
}