在Swift 5中使用UIPageViewController:第1部分
•19/5/30:已为Swift 5更新了此内容,更正了一个错误。
这比其他任何东西都更适合我自己,因为UIPageViewControllers具有一些我经常要提醒自己的怪癖。
如果有人遇到这个问题,希望对您有所帮助。
首先,本教程将不使用情节提要。 这仍然适用于情节提要,但是如果您正在寻找基于情节提要的解决方案,则应牢记这一点。
因此,创建一个名为ViewController
的新ViewController
并添加一个名为UIPageViewController
类型的名为pageController
的可选变量。
私人var pageController:UIPageViewController?
接下来,我们需要viewcontroller
扩展UIPageViewControllerDataSource
和UIPageViewControllerDelegate
。 使用extension
执行此操作,并添加所需的协议方法UIViewController()
现在返回UIViewController()
。
扩展ViewController:UIPageViewControllerDataSource,UIPageViewControllerDelegate {
func pageViewController(_ pageViewController:UIPageViewController,viewControllerBefore viewController:UIViewController)-> UIViewController吗? {
返回UIViewController()
}
func pageViewController(_ pageViewController:UIPageViewController,viewControllerAfter viewController:UIViewController)-> UIViewController吗? {
返回UIViewController()
}
现在,在您的viewDidLoad
或其他方法中,设置您的pageController
。
私人功能setupPageController(){
self.pageController = UIPageViewController(transitionStyle:.scroll,navigationOrientation:.horizontal,选项:nil)
self.pageController?.dataSource =自我
self.pageController?.delegate =自我
self.pageController?.view.backgroundColor = .clear
self.pageController?.view.frame = CGRect(x:0,y:0,width:self.view.frame.width,height:self.view.frame.height)
self.addChild(self.pageController!)
self.view.addSubview(self.pageController!.view)
self.pageController?.didMove(toParent:self)
}
这就是一大堆代码,它是做什么的? 首先,我们以滚动样式创建pageController
,并使其侧向滑动。 然后,将viewController
设置为数据源,以便它知道从哪里获取尚未添加的所有viewControllers
。 然后,将viewController
设置为委托,以便我们的pageController
知道向谁讲述更新信息等。然后,由于调酒师的选择,将背景设置为清除。 然后,将其大小设置为计划添加到的视图。 接下来,我们将pageController
添加为viewController
的子viewController
。 这样一来,我们可以将发生在主viewController
上的所有事件viewController
给pageController,而不会弄乱层次结构等。有关详细说明,请阅读stackoverflow线程
我们仍然需要用实际的viewcontrollers
填充此pageController
并告诉它有多少。 这些可以是扩展UIViewController
任何东西。 对于此示例,我正在使用一个自定义的viewController
,它恰好是我目前正在处理的内容。
首先,让我们创建一个我们要表示的数据对象的数组。 在这种情况下,我将使用与设备相对应的灯。 这些模型表示为DeviceLight
,并将存储为private var lights: [DeviceLight]
viewController
private var lights: [DeviceLight]
在我们的viewController
。 我们也可以只使用预制的UIViewControllers数组,但是如果它是重复视图,则更有意义的是重用相同的视图并动态地(考虑tableviewcell)或通过传递模型来填充它。
现在,通过添加可选的UIPageViewControllerDataSource
方法,让pagecontroller知道有多少个:
funcpresentationCount(用于pageViewController:UIPageViewController)-> Int {
返回self.lights.count
}
接下来,我们需要创建一个变量来跟踪名为private var currentIndex: Int
的viewController
索引,并在viewController
的init中将其设置为零。 然后在可选方法中返回:
funcpresentationIndex(用于pageViewController:UIPageViewController)-> Int {
返回self.currentIndex
}
在构建和运行应用程序并转到包含页面控制器的ViewController时,您现在应该在视图底部看到圆点。
在下一部分中,我们将填充pageController
。 未完待续..