在模态视图控制器后面更改视图控制器

时间:2016-03-24 06:54:24

标签: ios xcode swift uistoryboardsegue unwind-segue

我想为“联系人”应用创建类似于完成/编辑页面的内容。似乎模态视图背后的视图发生了变化,但是我不确定是如何产生这种行为的。

以下是我到目前为止所看到的内容:

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方法的不同组合,但我也无法解决这个问题。

任何帮助将不胜感激!非常感谢你的时间:))

1 个答案:

答案 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)
    }
}