Я пытаюсь создать учебник / введение для моего приложения, и поскольку на данный момент я не уверен, сколько у него будет страниц, я решил использовать UIPageViewController с одним дочерним элементом.
Мое намерение состоит в том, чтобы сохранить все данные, которые я хочу отобразить, в массиве объектов и использовать индекс текущего отображаемого представления внутри моего UIPageViewController для получения нужного мне объекта из этого массива.
override func viewWillAppear(_ animated: Bool)
{
print("PageContentVC > viewWillAppear")
ivPageContent.image = UIImage(named: DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentImage!)
lblPageContentTitle.text = DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentLabel!
lblPageContentText.text = DataSingleton.sharedInstance.returnTutorialVCContent()[contentPage].contentText!
}
Для этого мне нужно передать этот индекс из моего UIPageViewController его дочернему элементу ContentPageVC.
У меня нет проблем с получением индекса, но у меня возникают трудности при передаче его в ContentPageVC.
import UIKit
class TutorialPageVC : UIPageViewController,
UIPageViewControllerDataSource,
UIPageViewControllerDelegate
{
/*
// MARK: - Variables & Constants
*/
var contentPage : Int = 0
var collectionViewPageControl : UIPageControl = UIPageControl()
lazy var pagesArray : [UIViewController] =
{
return [self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent"),
self.VCInstance(name: "pageContent")]
}()
private func VCInstance(name: String) -> UIViewController
{
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)
}
/*
// MARK: - VC Status
*/
override func viewDidLoad()
{
super.viewDidLoad()
print("TutorialPageVC > viewDidLoad")
self.dataSource = self
self.delegate = self
if let firstVC = pagesArray.first
{
setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
}
let pageControl = UIPageControl.appearance()
pageControl.currentPageIndicatorTintColor = UIColor.activeColor
pageControl.pageIndicatorTintColor = UIColor.backgroundColor
self.view.backgroundColor = UIColor.clear
}
override func viewDidLayoutSubviews()
{
super.viewDidLayoutSubviews()
print("TutorialPageVC > viewDidLayoutSubviews")
for view in self.view.subviews
{
if view is UIScrollView { view.frame = UIScreen.main.bounds }
}
}
/*
// MARK: - UIPageViewController Delegates
*/
public func pageViewController(_ pageViewController: UIPageViewController,
viewControllerBefore viewController: UIViewController) -> UIViewController?
{
print("TutorialPageVC > pageViewController > viewControllerBefore")
guard let viewControllerIndex = pagesArray.firstIndex(of: viewController) else { return nil }
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else { return pagesArray.last }
guard pagesArray.count > previousIndex else { return nil }
return pagesArray[previousIndex]
}
public func pageViewController(_ pageViewController: UIPageViewController,
viewControllerAfter viewController: UIViewController) -> UIViewController?
{
print("TutorialPageVC > pageViewController > viewControllerAfter")
guard let viewControllerIndex = pagesArray.firstIndex(of: viewController) else { return nil }
let nextIndex = viewControllerIndex + 1
guard nextIndex < pagesArray.count else { return pagesArray.first }
guard pagesArray.count > nextIndex else { return nil }
return pagesArray[nextIndex]
}
public func presentationCount(for pageViewController: UIPageViewController) -> Int
{
print("TutorialPageVC > presentationCount")
return pagesArray.count
}
public func presentationIndex(for pageViewController: UIPageViewController) -> Int
{
print("TutorialPageVC > presentationIndex")
guard let firstViewController = viewControllers?.first,
let firstViewControllerIndex = pagesArray.firstIndex(of: firstViewController) else
{
return 0
}
return firstViewControllerIndex
}
public func pageViewController(_ pageViewController: UIPageViewController,
willTransitionTo pendingViewControllers: [UIViewController])
{
print("TutorialPageVC > pageViewController > willTransitionTo")
}
public func pageViewController(_ pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool)
{
print("TutorialPageVC > pageViewController > didFinishAnimating")
if completed
{
if let currentViewController = pageViewController.viewControllers?.first,
let index = pagesArray.firstIndex(of: currentViewController)
{
contentPage = index
print(contentPage)
}
}
}
}
Я некоторое время искал решение, и нашел следующее:
PageViewController передает данные дочернему контроллеру
Передача данных между UIPageViewController Дочерние представления с помощью Swift
PageViewController - передача переменных в дочерние представления
как передать данные из UIPageViewController в дочерний ViewController с помощью делегатов
Я знаю, что это распространенная проблема, но, к сожалению, ни одно из найденных мной решений не сработало для меня, и я не понимаю, почему и чего мне не хватает.
Есть идеи?