Использование UIPageViewController с контроллерами swift и несколькими видами
Я пытаюсь использовать UIPageViewController в приложении Swift с несколькими контроллерами вида. У меня есть 2 контроллера вида на раскадровке (firstViewController и secondViewController), которые встроены в свои собственные навигационные контроллеры. Они имеют идентификаторы раскадровки "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
}
}
Файл для 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
}
}
Однако, когда я запускаю свое приложение, кажется, что у него нет контроллера вида страницы. Он просто показывает firstViewController, и все. Ни точек, ни страниц и т. д. Кто-нибудь знает, что случилось? Я нашел несколько учебников Objective-C, но все они охватывают использование одного контроллера вида для всех страниц и имеют корневой контроллер вида, который не является страницей в Так что они не слишком помогли. Я надеялся, что это будет похоже на использование 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)
}
}
Однако теперь приложение просто висит на черном экране и в конечном итоге Xcode теряет связь с симулятором. Я не совсем понимаю, что происходит.
3 ответов:
Ладно, я все понял. поскольку мне нужно было, чтобы контроллер представления страниц был корневым и обрабатывал все, я подкласс
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 } }
Sure cause FirstViewController-контроллер начального вида в вашей раскадровке
Добавьте пользовательский подкласс UIPageViewController в свою раскадровку, отметьте его как начальный и выполните всю работу внутри, создайте экземпляры элементов контроллера страницы с помощью раскадровки в своем подклассе UIPageViewController, сделайте то же самое только внутри другого класса
Пожалуйста, имейте в виду, что этот код будет работать только с двумя
ViewController. Если вы планируете использовать больше, вы должны изменить строку:self.index = self.index + 1Найдено на до и после вызова, чтобы:
self.index = index + 1Для вызова текущего индекса
ViewController.
Comments