简体   繁体   English

UIPageViewController setViewControllers

[英]UIPageViewController setViewControllers

I am trying to implement a PageViewController that switches to a different ViewController when a button is pressed. 我正在尝试实现一个PageViewController,当按下一个按钮时,它会切换到另一个ViewController。 I can successfully load each "child" ViewController using the setViewControllers method during viewDidLoad(). 我可以在viewDidLoad()期间使用setViewControllers方法成功加载每个“子级” ViewController。

However when I call the setViewControllers method outside viewDidLoad(), it does not change the current "child" ViewController. 但是,当我在viewDidLoad()外部调用setViewControllers方法时,它不会更改当前的“子级” ViewController。

Can you call the method setViewControllers at any point or just once during viewDidLoad()? 您可以在viewDidLoad()期间随时调用方法setViewControllers吗? Also is there a way to change a variable in the pageviewcontrollers dataSource extensions? 还有没有办法在pageviewcontrollers dataSource扩展中更改变量?

My project consists of a entry ViewController with a "Settings" button and a ContainerView. 我的项目包含一个带有“设置”按钮的ViewController条目和一个ContainerView。 Inside the ContainerView I have the UIPageViewController. 在ContainerView内部,我有UIPageViewController。

Code for PageViewController: PageViewController的代码:

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
    }
}

}

Extensions: 扩充功能:

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

You can call setViewControllers at any point (I've been doing that). 您可以随时调用setViewControllers (我一直在这样做)。

The fact that it does not produce expected results is probably a result of bug in your code, include your code if you want to help out with that. 它不能产生预期结果的事实可能是代码中的错误所致,如果需要帮助,请包括您的代码。

Thank you for your help, I figured out what I was doing wrong. 谢谢您的帮助,我弄清楚我做错了什么。 I didn't have the right reference for the active PageViewController in the ContainerView. 对于ContainerView中的活动PageViewController,我没有正确的引用。

So of course called the setViewControllers function on random PageViewController did not produce the correct results. 因此,当然在随机PageViewController上调用setViewControllers函数不会产生正确的结果。

I found this answer explains how to correctly get a reference from a ContainerView 我发现此答案说明了如何从ContainerView正确获取引用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 UIPageViewController和setViewControllers: - UIPageViewController and setViewControllers: UIPageViewController不能与setViewControllers一起使用 - UIPageViewController does not advance with setViewControllers UIPageViewController setViewControllers,UIPageControl没有显示正确的当前编号 - UIPageViewController setViewControllers, UIPageControl not showing right current number 如何跳到UIPageViewController中的特定页面,setViewControllers不起作用 - How to jump to a specific page in UIPageViewController, setViewControllers not working Xamarin iOS UIPageViewController SetViewControllers参见页面之间 - Xamarin iOS UIPageViewController SetViewControllers see page between 如何防止UIPageViewController的setViewControllers方法崩溃? - How to prevent a UIPageViewController's setViewControllers method from crashing? UITabBarController子类从不调用setViewControllers:或setViewControllers:animated: - UITabBarController subclass never calls setViewControllers: or setViewControllers:animated: UINavigationViewController setViewControllers设置不正确 - UINavigationViewController setViewControllers not setting correctly UINavigation setViewControllers:内存分配 - UINavigation setViewControllers: memory allocation setViewControllers不起作用 - setViewControllers doesn't work
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM