【问题标题】:Why isn't my PageViewController's DataSource working correctly?为什么我的 PageViewController 的 DataSource 不能正常工作?
【发布时间】:2017-02-28 09:36:17
【问题描述】:

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

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

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

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

第一个视图控制器“Page the first”正确出现,但尝试滚动并不会调用方法,所以我还不能使用它们(因此它们现在返回 nil)。

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

我试过了

  • 将我的 DataSource 类设置为 UIScrollViewDelegateUIPageViewControllerDelegate,并将视图控制器的 delegate 设置为 DataSource
  • PageView 的过渡风格是 Scroll

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

【问题讨论】:

    标签: swift uipageviewcontroller xcode8 ios10


    【解决方案1】:

    UIPageViewController dataSource(和delegate)很弱。

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

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

    【讨论】:

    • 谢谢。以后我会记得的:)
    • 谢谢...我疯了,想弄清楚我的代码中发生了什么。我遇到了同样的问题,控制器没有强引用,所以它被释放了。
    • 我们该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    相关资源
    最近更新 更多