为什么我的PageViewController数据源无法正常工作?

时间:2016-10-18 23:25:07

标签: swift uipageviewcontroller xcode8 ios10

我创建了一个带有PageView控制器的简单故事板。

我将在另外两个视图控制器之间切换。

我的PageView控制器是一个自定义类TutorialPageViewController。我还创建了一个自定义DataSource类。

在DataSource类中,我希望在尝试滚动时调用pageViewController方法。然而,这种情况并非如此。我在这两种方法都有突破点,但从未被调用过。

第一个视图控制器," Page第一个"出现正确,但试图滚动并没有调用方法,所以我还不能使用它们(因此它们现在返回零)。

如果我将视图控制器的DataSource设置为self并将方法放在那里,则会正确调用它们。但我想将这些方法移到一个单独的类中,以便更好地进行代码管理。那么为什么它不起作用呢?

我已经尝试了

  • 将我的DataSource类设置为UIScrollViewDelegate以及UIPageViewControllerDelegate,并将视图控制器的delegate设置为DataSource
  • PageView的过渡方式为滚动

Storyboard overview

class TutorialPageViewController : UIPageViewController {
    override func viewDidLoad() {
        reset()
    }

    func reset() {
        let dataSource = TutorialPageDataSource(storyBoard: storyboard!)
        let content = dataSource.firstContentViewController

        self.dataSource = dataSource

        self.setViewControllers([content], direction: .forward, animated: true, completion: nil)
    }
}

class TutorialPageDataSource : NSObject, UIPageViewControllerDataSource {
    private var _storyboard: UIStoryboard

    var firstContentViewController: UIViewController
    var secondContentViewController: UIViewController

    init(storyBoard: UIStoryboard) {
        _storyboard = storyBoard
        firstContentViewController = _storyboard.instantiateViewController(withIdentifier: "FirstContentViewController")
        secondContentViewController = _storyboard.instantiateViewController(withIdentifier: "FirstContentViewController")
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        // break point here never reached
        return nil
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        // break point here never reached
        return nil
    }
}

1 个答案:

答案 0 :(得分:2)

UIPageViewController dataSource(和delegate)很弱。

您在TutorialPageDataSource方法中创建reset实例,将其分配给弱dataSource,然后TutorialPageDataSource实例超出范围并取消分配,因为那里不再是强烈的参考。现在,页面视图控制器的dataSource变为nil

您需要对TutorialPageDataSource实例保持强引用。使用实例变量来保留引用。