为什么我的 PageViewController 的数据源不能正常工作?

Why isn't my PageViewController's DataSource working correctly?

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

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

我的 PageView 控制器是自定义的 class TutorialPageViewController。我还创建了一个自定义数据源 class.

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

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

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

我试过了

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

UIPageViewController dataSource(和delegate)很弱。

您在 reset 方法中创建 TutorialPageDataSource 实例,将其分配给弱 dataSource,然后 TutorialPageDataSource 实例超出范围并被释放因为不再有对它的强引用。所以现在页面视图控制器的 dataSource 变成 nil.

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