[英]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.