我想为“联系人”应用创建类似于完成/编辑页面的内容。似乎模态视图背后的视图发生了变化,但是我不确定是如何产生这种行为的。
以下是我到目前为止所看到的内容:
iOS: Switch view controller behind current modal view controller?这篇文章似乎有正确的答案。但是,我不确定making the root view controller a delegate of the modal view
的含义及其对call a delegate method
的含义。
以下是我想要完成的事情:
想象一下嵌入在导航控制器中的vc1。我点击vc1上的一个按钮,导致vc2以模态方式呈现。当您在vc2上按“完成”时,它会取消模态视图vc2,并显示vc3。当您点击vc3上的后退按钮时,它会返回到vc1。
以下是当前行为:
我可以在vc1上以模态方式显示vc2。但是当在vc2上按下“完成”按钮时,它只会回到vc1而不是转到vc3然后,当点击“返回”时,转到vc1。
以下是我已经尝试过的内容:
我在没有动画的情况下尝试了从vc1到vc3的segue,然后以模态方式转换为v2。这种工作具有极其丑陋的过渡,它会导致出现Presenting view controllers on detached view controllers is discouraged
错误。此外,我尝试了unwindToSegue
方法的不同组合,但我也无法解决这个问题。
任何帮助将不胜感激!非常感谢你的时间:))
答案 0 :(得分:1)
通过在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)
}
}