关闭模态,然后立即推视图控制器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关闭模态,然后立即推视图控制器相关的知识,希望对你有一定的参考价值。

如何解除模态然后立即推送另一个视图?

我在didSelectRowAtIndexPath中添加此代码:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ChatTableViewController *chatVC = (ChatTableViewController*)[storyboard instantiateViewControllerWithIdentifier:@"chatVC"];
 [self dismissViewControllerAnimated:YES completion:^{
    [[self navigationController] pushViewController:chatVC animated:YES];
}];

模态视图解散,但之后没有任何反应。有任何想法吗?

答案

您无法将视图控制器推送到视图中,如果它被解除则会消失,因此推送另一个视图是不合逻辑的,导致父视图控制器被删除。可能你有这个: - ViewController 1 - > Modal ViewController 2 - >想要解雇VC2并推送VC3

你要做的是 - ViewController 1 - >模态ViewController 2 - >解除VC2 - >在VC1上推送VC3

您可以通过通知来完成。最有效的方法是使用委托,在VC2上创建一个委托,当它解散时通知V1,然后只推送VC3。

另一答案

不,就我所知,你不能快速完成,你需要在另一个控制器的消失和导航之间添加一个延迟,然后它会执行其他它会导致错误说,试图在解雇时推动控制器其他

另一答案

这个答案试图解决上面提到的原始问题。

A,B,C viewControllers。 A是navigationController的根VC。

A-> modally_presents - > B-> dismissing_modally_prsented_B_and_automatically_pushing - > C

注意:所有演示和解雇都是使用segues完成的。我标记了重要的一系列行动。

class CViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

/************************************************************/

protocol BDelegate: class {
    func BDelegateFunc(someRandomString: String)
}

class BViewController: UIViewController {

    weak var delegate: BDelegate?
    var name: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        name = "swappy"
    }

    @IBAction func btnClicked(_ sender: Any) {
       // 3 DISMISS using segue
        performSegue(withIdentifier: "unwindToAViewController", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 4
        print(segue.identifier)
    }

    deinit {
        // 6
        print(String(describing: type(of: self)) + #function)
        delegate?.BDelegateFunc(someRandomString: name!)
    }
}

/************************************************************/

class AViewController: UIViewController, BDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func btnClicked(_ sender: Any) {
        // 1 MODAL 
        performSegue(withIdentifier: "presentBFromA", sender: self)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        if segue.identifier == "presentBFromA" {
            // 2
            let vc = segue.destination as! BViewController
            vc.delegate = self
        } else if segue.identifier == "showCFromA" {
           // 8 This will finally push C in navigationController
            print(segue.identifier)
        }
    }

    @IBAction func unwindToAViewController(segue: UIStoryboardSegue) {
       // 5
        print(#function)
    }

    func BDelegateFunc(someRandomString: String) {
        // 7
        print(someRandomString)
        performSegue(withIdentifier: "showCFromA", sender: self)
    }
}

以上是关于关闭模态,然后立即推视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭模态视图控制器,然后立即让呈现视图控制器呈现不同的模态视图控制器?

ios:如何关闭模态视图控制器,然后弹出推送的视图控制器

关闭模态视图控制器后在根视图控制器中执行操作

一次关闭多个模态视图控制器?

通过模态视图呈现详细视图控制器 [关闭]

关闭当前的模态视图控制器,然后呈现新的模态视图控制器