Использование 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 теряет связь с симулятором. Я не совсем понимаю, что происходит.

671   3  

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

    Ничего не найдено.