viewpager pageviewcontroller page example control ios swift uipageviewcontroller

ios - pageviewcontroller - uipagecontrol swift 4



Uso de UIPageViewController con controladores de vista rápida y múltiple (3)

OK, ya lo entendí. ya que necesitaba que el controlador de vista de página fuera la raíz y manejara todo, UIPageViewController subclase de UIPageViewController como sugería iiFreeman y estaba de acuerdo con los protocolos de fuente de datos y delegado. Luego configuré el controlador en viewDidLoad e implementé los métodos de fuente de datos y delegado. Agregué un almacén de propiedades, una serie de identificadores de guión gráfico y uno para realizar un seguimiento del índice actual de esa matriz. También agregué un método auxiliar para devolver el controlador de vista correcto dado un índice. No necesitaba nada en mis otras subclases de controlador tableView ya que mi controlador de vista de página estaba manejando todo. Una cosa que sí me di cuenta es que, como mi tableViewController s estaba integrado en los controladores de navegación, mi controlador de vista de página realmente necesitaba mostrar los controladores de navegación, no los controladores tableView . a continuación es mi implementación:

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 } }

este post me ayudó mucho

Estoy tratando de utilizar un UIPageViewController en una aplicación Swift con múltiples controladores de vista. Tengo 2 controladores de vista en mi guión gráfico ( firstViewController y secondViewController ) que están integrados en sus propios controladores de navegación. Tienen identificadores de guión gráfico " FirstViewController " y " SecondViewController ". También tengo un controlador de vista de página en mi guión gráfico con el controlador identifierPageView y configuro la navegación al estilo horizontal y de transición para desplazarse en el inspector de atributos. FirstViewController es el controlador de vista raíz de la aplicación

Quiero que firstViewController sea ​​la primera página del controlador de vista de página, así que escribí su clase así:

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 } }

el archivo para SecondViewController ve así:

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 } }

Sin embargo, cuando ejecuto mi aplicación no parece tener un controlador de vista de página. Solo muestra firstViewController y eso es todo. Sin puntos, sin páginas, etc. ¿Alguien sabe qué está mal? He encontrado un par de tutoriales de Objective-C, pero todos cubren el uso de un controlador de vista para todas las páginas y tienen un controlador de vista de raíz que no es una página en la pageView página, por lo que no fueron de mucha ayuda. Tenía la esperanza de que fuera como usar un tabBarController donde simplemente haces clic y arrastras a los controladores de vista, pero lamentablemente no es el caso. como dije antes, no he trabajado con uno de estos antes, así que estoy algo perdido.

actualizar:

siguiendo la sugerencia de iiFreeman, yo subclasificé UIPageViewController y lo convertí en la raíz de mi archivo de guión gráfico. debajo esta la subclase

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) } }

Sin embargo, ahora la aplicación simplemente cuelga en una pantalla negra y, finalmente, Xcode pierde la conexión con el simulador. No estoy realmente seguro de lo que pasa.


Tenga en cuenta que este código solo funcionará con dos ViewController . Si planea usar más, tiene que cambiar la línea:

self.index = self.index + 1

Encontrado en la llamada antes y después, para:

self.index = index + 1

Para llamar al índice actual de ViewController .


causa segura FirstViewController - controlador de vista inicial en tu guión gráfico

agregue una subclase UIPageViewController personalizada en su guión gráfico, márquela como inicial y haga todo el trabajo interno, cree una instancia de los miembros del controlador de página con los ID de storyboard en su subclase UIPageViewController, haga lo mismo dentro de otra clase