Sto*_*ton 17 ios uipageviewcontroller swift
我正在尝试UIPageViewController在具有多个视图控制器的Swift应用程序中使用它.我的故事板(firstViewController和secondViewController)上有2个视图控制器,它们都嵌入在自己的导航控制器中.他们有故事板标识符" FirstViewController"和" SecondViewController".我的故事板上还有一个带identifierPageView控制器的页面视图控制器,并将导航设置为水平,过渡样式在属性检查器中滚动.FirstViewController是应用程序的根视图控制器
我想firstViewController成为页面视图控制器的第一页,所以我写了这样的类:
import Foundation
import UIKit
class FirsttViewController: UITableViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
override func viewDidLoad() {
let pageViewController: PageViewController = self.storyboard.instantiateViewControllerWithIdentifier("PageViewController") as PageViewController
pageViewController.delegate = self
var viewControllers: [UIViewController] = [self]
pageViewController.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
self.addChildViewController(pageViewController)
self.view.addSubview(pageViewController.view)
pageViewController.didMoveToParentViewController(self)
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {
let secondViewController: SecondViewController = self.storyboard.instantiateViewControllerWithIdentifier("SecondViewController") as SecondViewController
return secondViewController
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {
return nil
}
func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int {
return 2
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int {
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
SecondViewController看起来像这样的文件:
import Foundation
import UIKit
class SecondViewController: UITableViewController, UIPageViewControllerDataSource {
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {
return nil
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {
let firstViewController: FirstViewController = self.storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as FirstViewController
return firstViewController
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序时,它似乎没有页面视图控制器.它只是显示firstViewController,就是这样.没有点,没有页面等.任何人都知道什么是错的?我发现了一些Objective-C教程,但它们都涵盖了对所有页面使用一个视图控制器,并且有一个根视图控制器,它不是一个页面,pageView因此它们没有太多的帮助.我希望它会像tabBarController你只是点击并拖动到视图控制器,但不幸的是不是这样.就像我说的那样,我之前没有和其中一个合作过,所以我有点失落.
根据iiFreeman的建议,我UIPageViewController将其子类化并将其作为故事板文件的根.下面是子类
import Foundation
import UIKit
class PageViewController: UIPageViewController {
override func viewDidLoad() {
let startingViewController = self.storyboard.instantiateViewControllerWithIdentifier("FirstViewController") as FirstViewController
self.dataSource = startingViewController
var viewControllers: [UIViewController] = [startingViewController]
self.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
}
Run Code Online (Sandbox Code Playgroud)
但是现在应用程序只挂在黑屏上,最终Xcode失去了与模拟器的连接.我不确定是什么事.
Sto*_*ton 33
好的,我明白了.因为我需要页面视图控制器作为根并处理所有内容,我将其子类UIPageViewController化为iiFreeman建议并符合委托和数据源协议.然后我在中设置控制器viewDidLoad,并实现委托和数据源方法.我添加了一个属性存储库,其中包含一个故事板标识符数组,以及一个用于跟踪该数组当前索引的标识符.我还添加了一个辅助方法,在给定索引的情况下返回正确的视图控制器.我的其他tableView控制器子类中没有任何东西,因为我的页面视图控制器正在处理所有事情.我意识到的一件事是,由于我tableViewController的内置控制器已经嵌入了导航控制器,我的页面视图控制器实际上需要显示导航控制器,而不是tableView控制器.以下是我的实施:
import Foundation
import UIKit
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var index = 0
var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"]
override func viewDidLoad() {
self.dataSource = self
self.delegate = self
let startingViewController = self.viewControllerAtIndex(self.index)
let viewControllers: NSArray = [startingViewController]
self.setViewControllers(viewControllers, direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
func viewControllerAtIndex(index: Int) -> UINavigationController! {
//first view controller = firstViewControllers navigation controller
if index == 0 {
return self.storyboard.instantiateViewControllerWithIdentifier("FirstNavigationController") as UINavigationController
}
//second view controller = secondViewController's navigation controller
if index == 1 {
return self.storyboard.instantiateViewControllerWithIdentifier("SecondNavigationController") as UINavigationController
}
return nil
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {
let identifier = viewController.restorationIdentifier
let index = self.identifiers.indexOfObject(identifier)
//if the index is the end of the array, return nil since we dont want a view controller after the last one
if index == identifiers.count - 1 {
return nil
}
//increment the index to get the viewController after the current index
self.index = self.index + 1
return self.viewControllerAtIndex(self.index)
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerBeforeViewController viewController: UIViewController!) -> UIViewController! {
let identifier = viewController.restorationIdentifier
let index = self.identifiers.indexOfObject(identifier)
//if the index is 0, return nil since we dont want a view controller before the first one
if index == 0 {
return nil
}
//decrement the index to get the viewController before the current one
self.index = self.index - 1
return self.viewControllerAtIndex(self.index)
}
func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int {
return self.identifiers.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int {
return 0
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
42668 次 |
| 最近记录: |