UIPageViewController 设置视图控制器

UIPageViewController setViewControllers

我正在尝试实现一个页面ViewController,当按下一个按钮时它会切换到另一个ViewController。我可以在 viewDidLoad().

期间使用 setViewControllers 方法成功加载每个 "child" ViewController

但是当我在 viewDidLoad() 之外调用 setViewControllers 方法时,它不会改变当前的 "child" ViewController.

能否在 viewDidLoad() 期间随时或仅调用一次方法 setViewControllers?还有一种方法可以更改 pageviewcontrollers 数据源扩展中的变量吗?

我的项目由一个带有 "Settings" 按钮的条目 ViewController 和一个 ContainerView 组成。在 ContainerView 里面我有 UIPageViewController.

页面代码ViewController:

import UIKit

class PageViewController: UIPageViewController {
var slides = [SlideItem]()
var currentIndex: Int!

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)!
    initSlides()
}

override func viewDidLoad() {
    super.viewDidLoad()

    if let viewController = viewSlideViewController(currentIndex ?? 0){
        let viewControllers = [viewController]

        setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
    }

    dataSource = self

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func viewSlideViewController(_ index: Int) -> SlideViewController? {

    guard let storyboard = storyboard,
    let page = storyboard.instantiateViewController(withIdentifier: "SlideViewController") as? SlideViewController else {
        return nil
    }

    page.slide = slides[index]
    page.slideIndex = index

    return page

}

func viewSettingsViewController(_ index: Int) -> SettingsViewController? {

    guard let storyboard = storyboard,
        let page = storyboard.instantiateViewController(withIdentifier: "SettingsViewController") as? SettingsViewController else {
            return nil
    }
    return page

}

func initSlides(){

    slides.append(SlideItem.init(filename: "Slide 1", comparison: false, highYield: false, videoURL: nil,
                                 groupOrganSystem: ["A"],
                                 groupMedicalSpecialty: ["B"]))
    slides.append(SlideItem.init(filename: "Slide 2", comparison: false, highYield: false, videoURL: nil,
                                 groupOrganSystem: ["A"],
                                 groupMedicalSpecialty: ["B"]))
}

func sidebarCommands(button: String, state: Bool){
    switch button {
        case "settings":
            self.setViewControllers([viewSettingsViewController(0)!], direction: .forward, animated: false, completion: nil)
            print("settings")
    default:
        return
    }
}

}

扩展:

extension PageViewController : UIPageViewControllerDataSource {

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

    if let viewController = viewController as? SlideViewController,
        let index = viewController.slideIndex,
        index > 0 {
        return viewSlideViewController(index - 1)
    }
    return nil
}

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

    if let viewController = viewController as? SlideViewController,
        let index = viewController.slideIndex,
        (index + 1) < slides.count {
        return viewSlideViewController(index + 1)
    }
    return nil
}
}

你可以这样使用UIPageviewController:(继承) https://medium.com/how-to-swift/how-to-create-a-uipageviewcontroller-a948047fb6af

您可以随时调用 setViewControllers(我一直这样做)。

它没有产生预期结果的事实可能是您的代码中存在错误的结果,如果您想帮助解决这个问题,请附上您的代码。

谢谢你的帮助,我知道我哪里做错了。我没有对 ContainerView 中活动的 PageViewController 的正确引用。

当然,随机调用 PageViewController 上的 setViewControllers 函数并没有产生正确的结果。