setViewControllers不起作用

时间:2018-04-24 16:15:02

标签: ios swift xcode uipageviewcontroller uicontainerview

我尝试使用NEXT按钮更改我的UIPageViewController的当前ViewController。所以我使用委托调用mainViewController中的containterViewController中的函数。但它并没有执行setViewControllers行。

在这里你可以看到我的代码:

这是我使用我的委托调用的方法:

func forwardPage() {
    print("Start")
    currentPage += 1
    print(vcs[currentPage])
    self.setViewControllers([vcs[currentPage]], direction: .forward, animated: true) { (true) in
        print("Done")
    }
}

这是我的代表:

protocol WalkthroughViewControllerDelegate {
   func forwardPage()
   func currentIndex() -> Int
}

这是连接到我的NEXT按钮的功能:

@IBAction func nextButtonTapped(_ sender: Any) {
    if let index = delegate?.currentIndex() {
        print("Here... \(index)")
        switch index {
        case 0...1:
            print("Forwarding...")
            delegate?.forwardPage()
        case 2:
            dismiss(animated: true, completion: nil)
        default: break
        }
    }

    updateUI()
}

除了"完成"之外的所有事情得到印刷

我真的很感谢你的帮助

由于这一点,我已经挣扎了很长一段时间

非常感谢:)

编辑:也许这是因为UIPageViewController在containerView中。但我不确定

第二次编辑:我已经为这个问题创建了一个git-hub存储库。这是链接:https://github.com/LennartPhil/App-Popup-Screen。我希望你能理解我不会向你展示我的所有档案。

1 个答案:

答案 0 :(得分:2)

好的 - 问题在于viewDidLoad()中的代码:

    let storyboard = UIStoryboard(name: "ExtraViewControllers", bundle: nil)
    let walkthroughPageVC = storyboard.instantiateViewController(withIdentifier: "WalkthroughPageVC") as! WalkthroughPageViewController
    delegate = walkthroughPageVC

正在创建WalkthroughPageViewController的新实例,只要viewDidLoad()退出就会超出范围。所以它不再存在。

您需要做的是在prepare(for segue:...)中获取对它的引用,并将其设置为您的代理:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? WalkthroughPageViewController {
        self.delegate = vc
    }
}

我将您的GitHub仓库分叉并将文件添加到项目中,因此您可以看到它运行:https://github.com/DonMag/App-Popup-Screen