关闭一个 ViewController 并呈现另一个 ViewControlloer - IOS - Swift 3

Posted

技术标签:

【中文标题】关闭一个 ViewController 并呈现另一个 ViewControlloer - IOS - Swift 3【英文标题】:Dismiss a ViewController and present another ViewControlloer - IOS - Swift 3 【发布时间】:2017-03-09 20:59:55 【问题描述】:

我想关闭一个 ViewController 并呈现另一个 ViewController。这是我的代码:

主VC:

@IBAction func loadFirstVCClicked(_ sender: UIButton)

    self.present(FirstViewController.loadVC()

FirstViewController:

static func load() -> FirstViewController

    let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
    return vc

@IBAction func exitClicked(_ sender: UIButton)

    self.dismiss(animated: true, completion: 
        self.present(SecondViewController.loadVC()
    )

第二视图控制器:

static func loadVC() -> SecondViewController

    let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
    return vc


@IBAction func exitClicked(_ sender: UIButton)

    self.dismiss(animated: true, completion: 
        //present MainVC - second VC should work as an interstitial ad
    )

我收到此错误:“FirstViewController 上的第二视图控制器,其视图不在窗口层次结构中!”

而且它没有显示出来。所以基本上我希望 SecondViewController 成为 SecondViewController 的解雇和 MainVC didLoad 之间的一种插页式广告

基本方案:

FirstViewController->SecondViewController->MainVC

您的任何建议将不胜感激。谢谢!

【问题讨论】:

您正在尝试从已关闭的 FirstViewController 中呈现。您应该从 MainVC 中呈现。 我会使用由 MainVC 实现并在您想要关闭它时由 SecondVC 调用的委托。然后 MainVC 解散 SecondVC 并呈现 FirstVC 【参考方案1】:

您不应该使用静态函数来创建视图控制器。显示插页式的正确方法首先打开 mainviewcontroller 和 onViewDidAppear 显示您的广告 viewcontroller

@IBAction func loadFirstVCClicked(_ sender: UIButton)

    let firstViewController = self.storyboard?.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController
    self.present(firstViewController)


@IBAction func loadMainVCClicked(_ sender: UIButton)

    let mainViewController = self.storyboard?.instantiateViewController(withIdentifier: "MainViewController") as! MainViewController
    self.present(firstViewController)


class MainViewController: UIViewController 

    override func viewDidAppear(_ animated: Bool) 
        super.viewDidAppear(animated)

        // there you can present your interstitial viewcontroller
    



class InterstitialViewController: UIViewController 

    // when user press close or after a time limit dismiss 


协议(委托)示例

// give the name you want
protocol LiveProtocol: class 

    func onFirstViewControllerDismissed()


还有你在 firstviewcontroller 之前的 live viewcontroller

class LiveViewController: UIViewController, LiveProtocol 

    ...

    internal func onFirstViewControllerDismissed() 

        // present your interstitial 

    


【讨论】:

您好,谢谢您的建议,但我只想在 FirstVC 关闭时才显示插页式广告,而不是在 MainVC 出现时显示插页式广告 因此,您必须拥有另一个在 FirstVC 关闭时处于活动状态的视图控制器,您可以通过委托触发它并显示插页式 你能告诉我吗?我是 ios 新手,因此可以委托模式

以上是关于关闭一个 ViewController 并呈现另一个 ViewControlloer - IOS - Swift 3的主要内容,如果未能解决你的问题,请参考以下文章

Swift:关闭 viewController 1 然后呈现 viewController 2

关闭呈现模式 ViewController

关闭 viewController 会重置呈现的 navigationController

使用 Swift 呈现新的 Viewcontroller 后如何关闭以前的 Viewcontroller?

iOS:在不访问其父 ViewController 的情况下关闭和呈现 ModalViewController

关闭以编程方式呈现在嵌套在 NavigationController 中的 ViewController 中的 ViewController 崩溃,但并非每次