簡體   English   中英

取消模態,然后立即推送視圖控制器

[英]Dismiss modal, then immediately push view controller

如何解開模態然后立即推送另一個視圖?

我在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-> Dismiss VC2->在VC1上推送VC3

您可以通過通知來完成。 最有效的方法是使用委托,在VC2上創建一個委托,當V1關閉時通知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)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM