【问题标题】:Dismiss modal, then immediately push view controller关闭模态,然后立即推送视图控制器
【发布时间】:2014-09-16 08:21:19
【问题描述】:

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

我在 didSelectRowAtIndexPath 中添加此代码:

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

模态视图消失,但之后没有任何反应。有什么想法吗?

【问题讨论】:

  • 签入 [self navigationController] 返回 nil。
  • Not nil: (lldb) po [self navigationController]
  • 这段代码是在模态本身上(自行关闭)还是在父视图控制器上(父级关闭它之前呈现的内容)?
  • 关闭自己 - 这可能是它不起作用的原因。有什么解决办法吗?

标签: ios objective-c storyboard segue


【解决方案1】:

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

你要做的是 - ViewController 1 --> Modal ViewController 2 --> 关闭 VC2 --> 在 VC1 上推送 VC3

您可以通过通知来做到这一点。最有效的方法是使用委托,在 VC2 上创建一个委托,当 V1 关闭时通知 V1,然后推送 VC3。

【讨论】:

    【解决方案2】:

    不,据我所知,它不能那么快完成,您需要在关闭和另一个控制器的导航之间添加延迟,只有这样它才会执行,否则它会崩溃一个错误说,试图推动一个控制器同时解雇其他人

    【讨论】:

    • 这绝对可以很快完成,因为在初始视图完成进入(或离开)视图堆栈之前,完成块不会触发。 OP 只是试图在被解雇的模式上而不是在呈现的父模式上呈现新的 VC。
    【解决方案3】:

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

    A、B、C 视图控制器。 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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多