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