Swift 为什么不是';t我的页面视图控制器';数据源是否正常工作?

Swift 为什么不是';t我的页面视图控制器';数据源是否正常工作?,swift,uipageviewcontroller,xcode8,ios10,Swift,Uipageviewcontroller,Xcode8,Ios10,我创建了一个带有页面视图控制器的简单故事板 我将在其他两个视图控制器之间切换 我的PageView控制器是一个自定义类TutorialPageViewController。我还创建了一个自定义数据源类 在DataSource类中,我希望在尝试滚动时调用pageViewController方法。但事实并非如此。我在这两种方法中都有断点,它们从未被调用 第一个视图控制器“Page The first”显示正确,但尝试滚动不会调用这些方法,因此我还不能使用它们(因此它们现在返回nil) 如果我将视图控

我创建了一个带有页面视图控制器的简单故事板

我将在其他两个视图控制器之间切换

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

在DataSource类中,我希望在尝试滚动时调用
pageViewController
方法。但事实并非如此。我在这两种方法中都有断点,它们从未被调用

第一个视图控制器“Page The first”显示正确,但尝试滚动不会调用这些方法,因此我还不能使用它们(因此它们现在返回nil)

如果我将视图控制器的数据源设置为
self
,并将方法放在其中,则会正确调用它们。但是为了更好地管理代码,我想将这些方法转移到一个单独的类中。那它为什么不起作用呢

我试过了

  • 将我的数据源类设置为
    UIScrollViewDelegate
    以及
    UIPageViewControllerDelegate
    ,并将视图控制器的
    委派设置为数据源
  • 页面视图的转换样式为滚动


UIPageViewController数据源
(和
委托
)较弱

reset
方法中创建
TutorialPageDataSource
实例,将其分配给弱
dataSource
,然后
TutorialPageDataSource
实例超出范围并被解除分配,因为不再有对它的强引用。因此,现在页面视图控制器的
数据源
变为
nil


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

UIPageViewController数据源
(和
委托
)较弱

reset
方法中创建
TutorialPageDataSource
实例,将其分配给弱
dataSource
,然后
TutorialPageDataSource
实例超出范围并被解除分配,因为不再有对它的强引用。因此,现在页面视图控制器的
数据源
变为
nil


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

谢谢。我以后会记得那个:)谢谢……我想弄清楚我的代码里发生了什么,真是疯了。我有同样的问题,控制器没有一个强大的参考,所以它被解除分配。我们如何才能做到这一点?谢谢。我以后会记得那个:)谢谢……我想弄清楚我的代码里发生了什么,真是疯了。我有同样的问题,控制器没有一个强引用,所以它被释放。我们如何才能做到这一点?
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
    }
}