为什么我的 PageViewController 的数据源不能正常工作?
Why isn't my PageViewController's DataSource working correctly?
我用 PageView 控制器创建了一个简单的故事板。
我将在另外两个视图控制器之间切换。
我的 PageView 控制器是自定义的 class TutorialPageViewController
。我还创建了一个自定义数据源 class.
在 DataSource class 中,我希望在尝试滚动时调用 pageViewController
方法。然而,这种情况并非如此。我在这两种方法上都有断点,但它们从未被调用过。
第一个视图控制器 "Page the first" 正确出现,但尝试滚动并没有调用方法,所以我还不能使用它们(因此它们 return nil 现在).
如果我将视图控制器的数据源设置为 self
并将方法放在那里,它们将被正确调用。但我想将这些方法移到一个单独的 class 中,以便更好地管理代码。那么为什么它不起作用?
我试过了
- 将我的数据源 class 设置为
UIScrollViewDelegate
和 UIPageViewControllerDelegate
并将视图控制器的 delegate
设置为数据源
- 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
}
}
UIPageViewController dataSource
(和delegate
)很弱。
您在 reset
方法中创建 TutorialPageDataSource
实例,将其分配给弱 dataSource
,然后 TutorialPageDataSource
实例超出范围并被释放因为不再有对它的强引用。所以现在页面视图控制器的 dataSource
变成 nil
.
您需要保持对 TutorialPageDataSource
实例的强引用。使用实例变量来保留引用。
我用 PageView 控制器创建了一个简单的故事板。
我将在另外两个视图控制器之间切换。
我的 PageView 控制器是自定义的 class TutorialPageViewController
。我还创建了一个自定义数据源 class.
在 DataSource class 中,我希望在尝试滚动时调用 pageViewController
方法。然而,这种情况并非如此。我在这两种方法上都有断点,但它们从未被调用过。
第一个视图控制器 "Page the first" 正确出现,但尝试滚动并没有调用方法,所以我还不能使用它们(因此它们 return nil 现在).
如果我将视图控制器的数据源设置为 self
并将方法放在那里,它们将被正确调用。但我想将这些方法移到一个单独的 class 中,以便更好地管理代码。那么为什么它不起作用?
我试过了
- 将我的数据源 class 设置为
UIScrollViewDelegate
和UIPageViewControllerDelegate
并将视图控制器的delegate
设置为数据源 - 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
}
}
UIPageViewController dataSource
(和delegate
)很弱。
您在 reset
方法中创建 TutorialPageDataSource
实例,将其分配给弱 dataSource
,然后 TutorialPageDataSource
实例超出范围并被释放因为不再有对它的强引用。所以现在页面视图控制器的 dataSource
变成 nil
.
您需要保持对 TutorialPageDataSource
实例的强引用。使用实例变量来保留引用。