在Swift 5中使用UIPageViewController:第1部分

•19/5/30:已为Swift 5更新了此内容,更正了一个错误。

这比其他任何东西都更适合我自己,因为UIPageViewControllers具有一些我经常要提醒自己的怪癖。

如果有人遇到这个问题,希望对您有所帮助。

首先,本教程将不使用情节提要。 这仍然适用于情节提要,但是如果您正在寻找基于情节提要的解决方案,则应牢记这一点。

因此,创建一个名为ViewController的新ViewController并添加一个名为UIPageViewController类型的名为pageController的可选变量。

 私人var pageController:UIPageViewController? 

接下来,我们需要viewcontroller扩展UIPageViewControllerDataSourceUIPageViewControllerDelegate 。 使用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:.horizo​​ntal,选项: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: IntviewController索引,并在viewController的init中将其设置为零。 然后在可选方法中返回:

  funcpresentationIndex(用于pageViewController:UIPageViewController)-> Int { 
 返回self.currentIndex 
  } 

在构建和运行应用程序并转到包含页面控制器的ViewController时,您现在应该在视图底部看到圆点。

在下一部分中,我们将填充pageController 。 未完待续..