gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 12:38:37 25 4
gpt4 key购买 nike

我用 PageView Controller 创建了一个简单的 Storyboard。

我将在另外两个 View Controller 之间切换。

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

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

第一个 View Controller “Page the first”正确显示,但尝试滚动不会调用方法,所以我还不能使用它们(因此它们现在返回 nil)。

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

我试过了

  • 将我的 DataSource 类设置为 UIScrollViewDelegate 以及 UIPageViewControllerDelegate 并将 View Controller 的 delegate 设置为 DataSource
  • PageView 的过渡样式是Scroll

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

最佳答案

UIPageViewController dataSource(和 delegate)很弱。

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

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

关于swift - 为什么我的 PageViewController 的数据源不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com