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

Posted

技术标签:

【中文标题】在模态视图控制器后面更改视图控制器【英文标题】:Changing View Controllers Behind a Modal View Controller 【发布时间】:2016-03-24 06:54:23 【问题描述】:

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

这是我目前看到的:

ios: Switch view controller behind current modal view controller? 看来这篇文章有一个正确的答案。但是,我不确定他所说的 making the root view controller a delegate of the modal viewcall a delegate method 是什么意思。

这是我想要完成的:

想象一个嵌入在导航控制器中的 vc1。我点击 vc1 上的一个按钮,它会导致 vc2 以模态方式呈现。当您在 vc2 上按“完成”时,它会关闭模态视图 vc2,并显示 vc3。当你点击 vc3 上的后退按钮时,它会返回到 vc1。

这是当前行为:

我可以让 vc2 以模态方式显示在 vc1 之上。但是当在 vc2 上按下“完成”按钮时,它只是返回到 vc1 而不是转到 vc3,然后,当点击“返回”时,转到 vc1。

这是我已经尝试过的:

我尝试在没有动画的情况下从 vc1 切换到 vc3,然后以模态方式切换到 v2。这种工作与极其丑陋的过渡,它会导致这个Presenting view controllers on detached view controllers is discouraged 错误显示。另外,我尝试了unwindToSegue 方法的不同组合,但我也想不通。

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

【问题讨论】:

【参考方案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)
    

【讨论】:

我为超级迟到的回复道歉。但是非常感谢您花时间回答我的问题。这行代码_vc2.delegate = self背后的意义是什么? 我理解该代码的重要性。非常感谢您花时间回答我的问题。它解决了我的问题:) 您的解决方案不起作用。模态后面的控制器未交换

以上是关于在模态视图控制器后面更改视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从模态视图控制器中更改模态视图大小

当被模态视图控制器覆盖时,iOS 6 视图控制器布局在方向更改后不会更新

如何通知父视图控制器模态视图控制器中更改的屏幕方向?

更改模态视图控制器的cornerRadius

ios 8 更改呈现/模态视图控制器的大小

如何更改模态视图 iOS 6 上的状态栏