我创建了一个带有PageView控制器的简单故事板。
我将在另外两个视图控制器之间切换。
我的PageView控制器是一个自定义类TutorialPageViewController
。我还创建了一个自定义DataSource类。
在DataSource类中,我希望在尝试滚动时调用pageViewController
方法。然而,这种情况并非如此。我在这两种方法都有突破点,但从未被调用过。
第一个视图控制器," Page第一个"出现正确,但试图滚动并没有调用方法,所以我还不能使用它们(因此它们现在返回零)。
如果我将视图控制器的DataSource设置为self
并将方法放在那里,则会正确调用它们。但我想将这些方法移到一个单独的类中,以便更好地进行代码管理。那么为什么它不起作用呢?
我已经尝试了
UIScrollViewDelegate
以及UIPageViewControllerDelegate
,并将视图控制器的delegate
设置为DataSource 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
}
}
答案 0 :(得分:2)
UIPageViewController dataSource
(和delegate
)很弱。
您在TutorialPageDataSource
方法中创建reset
实例,将其分配给弱dataSource
,然后TutorialPageDataSource
实例超出范围并取消分配,因为那里不再是强烈的参考。现在,页面视图控制器的dataSource
变为nil
。
您需要对TutorialPageDataSource
实例保持强引用。使用实例变量来保留引用。