在iOS应用程序中,无涯教程使用容器和内容视图控制器来显示应用程序的内容。但是,需要在应用程序中的视图控制器之间进行导航,以便用户可以轻松地在视图控制器之间进行切换。在本教程的这一部分中,无涯教程将讨论PageViewControlller是容器视图控制器,它管理内容页面之间的导航,其中每个页面由子视图控制器管理。它是UIPageViewController的实例,该实例继承了UIViewController。
class UIPageViewController : UIViewController
在许多iOS应用程序中使用PageViewController来使用户在应用程序内容的各个页面之间导航。可以在应用程序中以编程方式控制导航。 PageViewController使用无涯教程指定的过渡来动画化更改。
在此示例中,无涯教程将使用两个视图控制器创建一个项目,其中根页面视图控制器管理视图控制器之间的导航。
首先,无涯教程需要将PageViewController添加到Storyboard。为此目的,在对象库中搜索页面视图控制器并将结果拖动到Storyboard。

如下图所示,这会将Page View Controller添加到storyboard。无涯教程将在属性检查器中将此视图控制器设置为初始视图控制器,并在身份检查器中将RootPageViewController.swift和Storyboard ID分配给RootVC。

自PageViewController之后,无涯教程添加了用于管理不同视图控制器之间的导航的功能。因此,在该项目中,无涯教程还将添加两个视图控制器,如下图所示。无涯教程为视图控制器提供了不同的背景色以进行识别。无涯教程还将StoryboardID提供给身份检查器中的视图控制器FirstVC和SecondVC。

在这里,无涯教程为该项目构建了Storyboard。现在,无涯教程将以编程方式在RootPageViewController类中定义导航。它符合UIPageViewControllerDataSource协议,并实现其两个方法以将在当前视图控制器之前和之后出现的视图控制器返回。
RootPageViewController类定义其中进行导航的View Controller列表。使用PageViewController类的setViewControllers()方法,将列表中存在的第一个视图控制器设置为当前视图控制器。
RootPageViewController.swift
import UIKit
class RootPageViewController: UIPageViewController {
lazy </span><span class="kwd">var</span><span class="pln"> vcList</span><span class="pun">:[</span><span class="typ">UIViewController</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> storyboard </span><span class="pun">=</span><span class="pln"> </span><span class="typ">UIStoryboard</span><span class="pun">(</span><span class="pln">name</span><span class="pun">:</span><span class="pln"> </span><span class="str">"Main"</span><span class="pun">,</span><span class="pln"> bundle</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> firstVC </span><span class="pun">=</span><span class="pln"> storyboard</span><span class="pun">.</span><span class="pln">instantiateViewController</span><span class="pun">(</span><span class="pln">identifier</span><span class="pun">:</span><span class="pln"> </span><span class="str">"FirstVC"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> secondVC </span><span class="pun">=</span><span class="pln"> storyboard</span><span class="pun">.</span><span class="pln">instantiateViewController</span><span class="pun">(</span><span class="pln">identifier</span><span class="pun">:</span><span class="pln"> </span><span class="str">"SecondVC"</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="pln">firstVC</span><span class="pun">,</span><span class="pln"> secondVC</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}()</span><span class="pln">
</span><span class="kwd">override</span><span class="pln"> func viewDidLoad</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="kwd">super</span><span class="pun">.</span><span class="pln">viewDidLoad</span><span class="pun">()</span><span class="pln">
</span><span class="com">//Do any additional setup after loading the view.</span><span class="pln">
</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">dataSource </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">self</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="kwd">let</span><span class="pln"> vc </span><span class="pun">=</span><span class="pln"> vcList</span><span class="pun">.</span><span class="pln">first</span><span class="pun">{</span><span class="pln">
</span><span class="kwd">self</span><span class="pun">.</span><span class="pln">setViewControllers</span><span class="pun">([</span><span class="pln">vc</span><span class="pun">],</span><span class="pln"> direction</span><span class="pun">:</span><span class="pln"> </span><span class="pun">.</span><span class="pln">forward</span><span class="pun">,</span><span class="pln"> animated</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> completion</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
extension RootPageViewController : UIPageViewControllerDataSource{
func pageViewController</span><span class="pun">(</span><span class="pln">_ pageViewController</span><span class="pun">:</span><span class="pln"> </span><span class="typ">UIPageViewController</span><span class="pun">,</span><span class="pln"> viewControllerBefore viewController</span><span class="pun">:</span><span class="pln"> </span><span class="typ">UIViewController</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-></span><span class="pln"> </span><span class="typ">UIViewController</span><span class="pun">?</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
guard </span><span class="kwd">let</span><span class="pln"> index </span><span class="pun">=</span><span class="pln"> vcList</span><span class="pun">.</span><span class="pln">lastIndex</span><span class="pun">(</span><span class="kwd">of</span><span class="pun">:</span><span class="pln"> viewController</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> previousIndex </span><span class="pun">=</span><span class="pln"> index </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
guard previousIndex </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">}</span><span class="pln">
guard previousIndex </span><span class="pun"><</span><span class="pln"> vcList</span><span class="pun">.</span><span class="pln">count </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> vcList</span><span class="pun">[</span><span class="pln">previousIndex</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
func pageViewController</span><span class="pun">(</span><span class="pln">_ pageViewController</span><span class="pun">:</span><span class="pln"> </span><span class="typ">UIPageViewController</span><span class="pun">,</span><span class="pln"> viewControllerAfter viewController</span><span class="pun">:</span><span class="pln"> </span><span class="typ">UIViewController</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-></span><span class="pln"> </span><span class="typ">UIViewController</span><span class="pun">?</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
guard </span><span class="kwd">let</span><span class="pln"> index </span><span class="pun">=</span><span class="pln"> vcList</span><span class="pun">.</span><span class="pln">lastIndex</span><span class="pun">(</span><span class="kwd">of</span><span class="pun">:</span><span class="pln"> viewController</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> previousIndex </span><span class="pun">=</span><span class="pln"> index </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln">
guard previousIndex </span><span class="pun">>=</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">}</span><span class="pln">
guard previousIndex </span><span class="pun"><</span><span class="pln"> vcList</span><span class="pun">.</span><span class="pln">count </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">nil</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> vcList</span><span class="pun">[</span><span class="pln">previousIndex</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
输出: