亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

模態視圖控制器-如何顯示和關閉

模態視圖控制器-如何顯示和關閉

iOS
慕村9548890 2019-10-24 10:44:06
在過去的一周中,我為解決如何顯示和消除多個視圖控制器問題而煩惱不已。我創建了一個示例項目,并直接從該項目中粘貼代碼。我有3個視圖控制器及其相應的.xib文件。MainViewController,VC1和VC2。我在主視圖控制器上有兩個按鈕。- (IBAction)VC1Pressed:(UIButton *)sender{    VC1 *vc1 = [[VC1 alloc] initWithNibName:@"VC1" bundle:nil];    [vc1 setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];    [self presentViewController:vc1 animated:YES completion:nil];}這將打開VC1,沒有任何問題。在VC1中,我有另一個按鈕應該打開VC2,同時關閉VC1。- (IBAction)buttonPressedFromVC1:(UIButton *)sender{    VC2 *vc2 = [[VC2 alloc] initWithNibName:@"VC2" bundle:nil];    [vc2 setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];    [self presentViewController:vc2 animated:YES completion:nil];    [self dismissViewControllerAnimated:YES completion:nil];} // This shows a warning: Attempt to dismiss from view controller <VC1: 0x715e460> while a presentation or dismiss is in progress!- (IBAction)buttonPressedFromVC2:(UIButton *)sender{    [self dismissViewControllerAnimated:YES completion:nil];} // This is going back to VC1. 我希望它返回到主視圖控制器,同時應從內存中永久刪除VC1。僅當我單擊主控制器上的VC1按鈕時,才會顯示VC1。主視圖控制器上的另一個按鈕也應該能夠直接繞過VC1來顯示VC2,并且在VC2上單擊一個按鈕時應回到主控制器。沒有長時間運行的代碼,循環或任何計時器。只需裸露電話即可查看控制器。
查看完整描述

3 回答

?
HUX布斯

TA貢獻1876條經驗 獲得超6個贊

我認為您誤解了有關iOS模式視圖控制器的一些核心概念。當您關閉VC1時,任何由VC1呈現的視圖控制器也將被關閉。Apple希望模式視圖控制器以堆疊的方式流動-在您的情況下,VC2由VC1提供。一旦您從VC1提供VC2,就將VC1解雇,這簡直是一團糟。為了實現所需的功能,在VC1退出后,buttonPressedFromVC1應該立即使mainVC出現在VC2中。我認為,沒有代表就可以實現這一目標。大致情況:


UIViewController presentingVC = [self presentingViewController];

[self dismissViewControllerAnimated:YES completion:

 ^{

    [presentingVC presentViewController:vc2 animated:YES completion:nil];

 }];

注意self.presentingViewController存儲在其他變量中,因為在vc1關閉自身之后,您不應對其進行任何引用。


查看完整回答
反對 回復 2019-10-24
?
慕田峪9158850

TA貢獻1794條經驗 獲得超8個贊

Swift中的示例,描繪了上述代工廠的說明和Apple的文檔:


基于Apple的文檔和上述鑄造廠的說明(糾正了一些錯誤),使用委托設計模式的presentViewController版本:

ViewController.swift


import UIKit


protocol ViewControllerProtocol {

    func dismissViewController1AndPresentViewController2()

}


class ViewController: UIViewController, ViewControllerProtocol {


    @IBAction func goToViewController1BtnPressed(sender: UIButton) {

        let vc1: ViewController1 = self.storyboard?.instantiateViewControllerWithIdentifier("VC1") as ViewController1

        vc1.delegate = self

        vc1.modalTransitionStyle = UIModalTransitionStyle.FlipHorizontal

        self.presentViewController(vc1, animated: true, completion: nil)

    }


    func dismissViewController1AndPresentViewController2() {

        self.dismissViewControllerAnimated(false, completion: { () -> Void in

            let vc2: ViewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("VC2") as ViewController2

            self.presentViewController(vc2, animated: true, completion: nil)

        })

    }


}

ViewController1.swift


import UIKit


class ViewController1: UIViewController {


    var delegate: protocol<ViewControllerProtocol>!


    @IBAction func goToViewController2(sender: UIButton) {

        self.delegate.dismissViewController1AndPresentViewController2()

    }


}

ViewController2.swift


import UIKit


class ViewController2: UIViewController {


}

基于上述代工廠的解釋(更正了一些錯誤),使用委托設計模式的pushViewController版本:

ViewController.swift


import UIKit


protocol ViewControllerProtocol {

    func popViewController1AndPushViewController2()

}


class ViewController: UIViewController, ViewControllerProtocol {


    @IBAction func goToViewController1BtnPressed(sender: UIButton) {

        let vc1: ViewController1 = self.storyboard?.instantiateViewControllerWithIdentifier("VC1") as ViewController1

        vc1.delegate = self

        self.navigationController?.pushViewController(vc1, animated: true)

    }


    func popViewController1AndPushViewController2() {

        self.navigationController?.popViewControllerAnimated(false)

        let vc2: ViewController2 = self.storyboard?.instantiateViewControllerWithIdentifier("VC2") as ViewController2

        self.navigationController?.pushViewController(vc2, animated: true)

    }


}

ViewController1.swift


import UIKit


class ViewController1: UIViewController {


    var delegate: protocol<ViewControllerProtocol>!


    @IBAction func goToViewController2(sender: UIButton) {

        self.delegate.popViewController1AndPushViewController2()

    }


}

ViewController2.swift


import UIKit


class ViewController2: UIViewController {


}


查看完整回答
反對 回復 2019-10-24
  • 3 回答
  • 0 關注
  • 610 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號