【发布时间】:2015-06-15 17:14:19
【问题描述】:
我基本上有一个根 ViewController,我想将它传递到通过 PageViewController 连接的 ViewControllers 集合(所有不同的类本身)。
目前,我在根 ViewController 中设置了一个 prepareforsegue 来传递数据。然后我在 PageViewController 中声明了变量,并试图弄清楚如何将数据传递到 ViewControllers。
我目前只是在做一个简单的 Hello World 测试,所以我的代码有点简单。这是我的 RootViewController,我已将其传递到 PageViewController(并因此传递到连接到 PageViewController 的后续 VC):
class RootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
var hello: String! = "Hello World!"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "testSegue"){
var svc = segue.destinationViewController as! PageViewController;
svc.datapassed = self.hello
}
}
我的 PageView 控制器有点复杂。我正在使用情节提要 ID 方法,因为我希望 pageviewcontroller 显示不同类的视图控制器,而不是显示一个视图控制器模板和不同图像内容的大量教程......
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var datapassed: String!
var index = 0
var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"]
override func viewDidLoad() {
super.viewDidLoad()
setupPageControl()
self.dataSource = self
self.delegate = self
let startingViewController = self.viewControllerAtIndex(self.index)
let viewControllers: NSArray = [startingViewController]
self.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
// Do any additional setup after loading the view.
}
func viewControllerAtIndex(index: Int) -> UIViewController! {
if index == 0 {
return self.storyboard!.instantiateViewControllerWithIdentifier("FirstNavigationController") as! UIViewController
}
if index == 1 {
return self.storyboard!.instantiateViewControllerWithIdentifier("SecondNavigationController") as! UIViewController
}
return nil
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {
let identifier = viewController.restorationIdentifier
let index = self.identifiers.indexOfObject(identifier!)
if index == identifiers.count - 1 {
return nil
}
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 index == 0 {
return nil
}
self.index = self.index - 1
return self.viewControllerAtIndex(self.index)
}
private func setupPageControl() {
let appearance = UIPageControl.appearance()
appearance.pageIndicatorTintColor = UIColor.grayColor()
appearance.currentPageIndicatorTintColor = UIColor.whiteColor()
}
func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int {
return self.identifiers.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int {
return 0
}
}
最后,我只是想让第一个 ViewController 连接到 pageviewcontroller 以显示来自传递的变量 datapassed 的文本。
class FirstViewController: UIViewController {
@IBOutlet weak var helloLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
helloLabel.text = datapassed
// Do any additional setup after loading the view.
}
}
编辑: 可能的解决方案和最终代码:
class RootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
var carinfos: String! = "Hello World"
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let svc = segue.destinationViewController as? PageViewController
where segue.identifier == "testSegue" {
svc.dataPassed = self.carinfos
}
}
}
class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
var dataPassed: String? {
didSet {
self.updateCurrentViewController()
}
}
var index = 0
var identifiers: NSArray = ["FirstNavigationController", "SecondNavigationController"]
override func viewDidLoad() {
super.viewDidLoad()
self.dataSource = self
self.delegate = self
let startingViewController = self.viewControllerAtIndex(self.index)
let viewControllers: NSArray = [startingViewController]
self.setViewControllers(viewControllers as [AnyObject], direction: UIPageViewControllerNavigationDirection.Forward, animated: false, completion: nil)
}
func updateCurrentViewController() {
if let firstViewController = self.viewControllerAtIndex(self.index) as? FirstViewController, let data = self.dataPassed {
firstViewController.dataPassed = data
}
}
func pageViewController(pageViewController: UIPageViewController!, viewControllerAfterViewController viewController: UIViewController!) -> UIViewController! {
let identifier = viewController.restorationIdentifier
let index = self.identifiers.indexOfObject(identifier!)
if index == identifiers.count - 1 {
return nil
}
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 index == 0 {
return nil
}
self.index = self.index - 1
let viewController = self.viewControllerAtIndex(self.index)
self.updateCurrentViewController()
return viewController
}
func viewControllerAtIndex(index: Int) -> UIViewController! {
if index == 0 {
return self.storyboard!.instantiateViewControllerWithIdentifier("FirstNavigationController") as! UIViewController
}
if index == 1 {
return self.storyboard!.instantiateViewControllerWithIdentifier("SecondNavigationController") as! UIViewController
}
return nil
}
func presentationCountForPageViewController(pageViewController: UIPageViewController!) -> Int {
return self.identifiers.count
}
func presentationIndexForPageViewController(pageViewController: UIPageViewController!) -> Int {
return 0
}
}
class FirstViewController: UIViewController {
var dataPassed: String?
@IBOutlet weak var firstLabelTest: UILabel!
@IBOutlet weak var firstLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
println(dataPassed)
firstLabel.text = "Hello, this is First"
self.populateData()
}
func populateData() {
if let data = self.dataPassed {
self.firstLabelTest.text = self.dataPassed
}
}
}
【问题讨论】:
标签: ios xcode swift uiviewcontroller uipageviewcontroller