我从这个tutorial学习使用swift中的UIPageViewController 在主视图控制器中:
// MARK: - Variables private var pageViewController: UIPageViewController? // MARK: - View Lifecycle override func viewDidLoad() { super.viewDidLoad() createPageViewController() setupPageControl() } private func createPageViewController() { let pageController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController pageController.dataSource = self if contentImages.count > 0 { let firstController = getItemController(0)! let startingViewControllers: NSArray = [firstController] pageController.setViewControllers(startingViewControllers as! [PageItemController], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) } pageViewController = pageController addChildViewController(pageViewController!) self.view.addSubview(pageViewController!.view) pageViewController!.didMoveToParentViewController(self) }
任何人都可以向我解释,为什么我们不会在开头分配pageViewController,如:
pageViewController = self.storyboard!.instantiateViewControllerWithIdentifier("PageController") as! UIPageViewController
为什么我们需要将值分配给" let"变量然后分配" let"变量为" var"变量?
为什么我们让事情变得复杂? :)
答案 0 :(得分:3)
你的方式绝对可行。请注意,从来没有一种正确的编码方式。但是,您忽略了一个副作用 - instantiateViewControllerWithIdentifier
返回一个带有未定义类型(AnyObject!
)的可选项,因此我们必须将其强制转换为特定类型UIPageViewController
。副作用是程序员决定在演员表中使用as!
删除可选项(结果为UIPageViewController
而不是UIPageViewController!
)。
通常,在每个函数的开头删除选项,然后使用非选项是有用的。由于实例变量pageViewController
是可选的,因此使用它会更难,更不易读,因为每次使用时都必须检查nil
(或强制解包)。
请注意代码中的差异:
pageController.setViewControllers(...
...
pageViewController!.didMoveToParentViewController(...
在我看来,你的例子中的代码不是很好,因为它可以自由地结合这两种方法。使用
pageViewController!.setViewControllers(...
...
pageViewController!.didMoveToParentViewController(...
或
pageController.setViewControllers(...
...
pageController.didMoveToParentViewController(...
会更具可读性。