如何从presentingViewController模态地呈现ViewController?

时间:2018-08-01 13:58:44

标签: ios swift uiviewcontroller

我有3个视图控制器。

将它们命名为A,B和C。

A提出B,然后在解散B后从A提出C。

A <=> B

A-> C

我该如何实现? 如果问题不清楚,请告诉我,我很乐意对其进行编辑。

5 个答案:

答案 0 :(得分:0)

B 中写一个协议,例如:

protocol VCBDelegate {
    func VCBDismissed()
}

Class VCB: UIViewController {
    weak var delegate: VCBDelegate?
    ....
}

现在解雇B的地方,请完整地调用委托方法。

func dismissB() {
    self.dismiss(animated: true) {
        self.delegate.VCBDismissed()
    }
}

现在在 A 中遵守此协议。

extension VCA: VCBDelegate {
    func VCBDismissed() {
        //Here you present C
        .....
    }
}

别忘了在 B 的演示中使代表成为自己。

希望这会有所帮助,如有任何疑问,请随时发表评论。

答案 1 :(得分:0)

在B里面试试这个

self.dismiss(animated: true) {

    let aVC = UIApplication.shared.keyWindow?.rootViewController as! AVC

    let cVC  = ///

    aVC.present(cVC, animated: true, completion: nil)
}

答案 2 :(得分:0)

好吧,我是这样实现的。 注意:我在 B 内。

let cViewController = // getting a handle of this view controller from Storyboard
let aViewController = self.navigationController?.presentingViewController

self.dismiss(animated: true) {
    aViewController?.present(cViewController, animated: true)
}

答案 3 :(得分:0)

您可以使用自定义通知观察器,如下所示:

在控制器A中:

override func viewDidLoad() {
     super.viewDidLoad()

     // Register to custom notification 
     NotificationCenter.default.addObserver(self, selector: #selector(presentC), name: NSNotification.Name(rawValue: "BDismissed"), object: nil)

     // Rest of your code
}

func presentC {
 // Controller C presentation code goes here
}

在控制器B中:

override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)

        NotificationCenter.default.post(name: NSNotification.Name(rawValue: "BDismissed"), object: nil, userInfo: nil)
}

答案 4 :(得分:0)

您可以使用闭包,它更好,更简单。 您的A将出示B,并在其关闭时给其闭包呼叫,此闭包将出示C。

这里是一个例子:

class ViewControllerA : UIViewController{

    func showViewControllerB(){
        let vc = ViewControllerB()
        vc.callOnDismiss = { [weak self] in
            self?.showViewControllerC()
        }
        self.present(vc, animated: true, completion: nil);
    }

    func showViewControllerC(){
        let vc = ViewControllerC()
        self.present(vc, animated: true, completion: nil);
    }
}

class ViewControllerB : UIViewController{

    var callOnDismiss : () -> () = {}

    func actionOnDismiss(){
        self.dismiss(animated: true, completion: nil)
        self.callOnDismiss()
    }

}

class ViewControllerC : UIViewController{

}