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