【问题标题】:UIPageViewControllerDataSource is not called未调用 UIPageViewController 数据源
【发布时间】:2019-09-24 14:49:34
【问题描述】:

没有从 ViewDidLoad 调用 UIPageViewControllerDataSource,因此只显示第一页并且滑动没有任何作用。

我已按照本教程进行操作:

https://spin.atomicobject.com/2015/12/23/swift-uipageviewcontroller-tutorial/

类似问题的答案不起作用。我查看了 5 个类似的问题,但没有一个对我有用。


class SetupViewController: UIPageViewController {

      private(set) lazy var pages : [UIViewController] = {
         return [self.newPage(1), self.newPage(2), self.newPage(3), self.newPage(4)]
      }()

      private func newPage(_ page: Int) -> UIViewController {
          return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "Page\(page)")
      }

      override func viewDidLoad() {
            super.viewDidLoad()  

            dataSource = self

            if let firstPage = pages.first {
                print(#function, "if let firstPage", firstPage, pages)  //viewDidLoad() if let firstPage page1name [page1, page2, page3, page4]
                setViewControllers([firstPage], direction: .forward, animated: true, completion: nil)

          }
     }
}

extension SetupViewController: UIPageViewControllerDataSource {

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        print(#function)           //It doesn't print
        guard let pageIndex = pages.firstIndex(of: viewController) else { return nil }
        let nextIndex = pageIndex + 1
        let pageCount = pages.count
        guard nextIndex != pageCount else { return nil }
        guard pageCount > nextIndex else { return nil }
        return pages[nextIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        print(#function)            //It doesn't print
        guard let pageIndex = pages.firstIndex(of: viewController) else { return nil }
        let previousIndex = pageIndex - 1
        guard previousIndex >= 0 else { return nil }
        guard pages.count > previousIndex else { return nil }
        return pages[previousIndex]
    }

}

故事板 ID 为:Page1、Page2、Page3 和 Page4

我做错了什么?

【问题讨论】:

    标签: ios swift uipageviewcontroller uipagecontrol


    【解决方案1】:

    可能你有配置问题我在这里创建了一个演示

    https://github.com/ShKhan9/PagerShow


    let wind = (UIApplication.shared.delegate as! AppDelegate).window!
    wind.rootViewController = SetupViewController()
    

    【讨论】:

    • 我的 AppDelegate 中没有这个:'window?.rootViewController = SetupViewController()'。由于这是一个更大项目的一部分,SetupViewController 不是我最初的视图控制器。有没有其他方法可以让它工作?
    • 那么,我在哪里称“风”?
    • 你使用 xcode 11 吗?您可以在任何更改 rootVC 的操作中执行此操作
    • 有效!我将它添加到 segue 函数中。谢谢!
    • 这解决了我的问题,但创建了一个新问题。 UIPageViewController 显示为导航控制器内的视图(参考 A)的子视图。当我使用此解决方案时,在第二次访问视图 (A) 时,我失去了“
    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多