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

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

我在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 – > Modal 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) } }