Swift 4 UIPageViewController не показывает правильные представления (как определено в массиве в последовательности - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь создать небольшое приложение для цитат.Кавычки находятся в массиве объектов.У некоторых есть статья, которая предоставляет больше информации о цитате.

Я использую 2 вида viewcontroller.У одного есть текстовый блок для статьи, а у другого нет.

класс UIPageViewController настроен так, чтобы пользователь мог пролистывать кавычки.Это управляется массивом объектов выше.Код проходит через массив и затем, если в объекте var в объекте есть строка, он показывает одно представление.Если строка пуста, она показывает другую.

Я могу заставить программу поменять местами представления, но счетчик работает неправильно.Это похоже на простую проблему, но я не могу понять это.

Бонус: Мой следующий шаг - выяснить, как в представлении будет отображаться выбранная цитата / автор / статья.Я также был бы очень признателен за любые советы по этому вопросу, так как это все для меня новоСпасибо!

Вот мой код

import UIKit

var thePack:[packItem] = [packItem(theQuote: "quote1", author: "", article: "hasarticle3"),packItem(theQuote: "quote2", author: "", article: ""),packItem(theQuote: "quote3", author: "", article: "hasarticle3")]

var packIndex:Int = 0

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

//set up the array of views to move to. All the different view types should be in here
lazy var subViewControllers:[UIViewController] = {
    return [
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen1") as! ViewController1,
        UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen2") as! ViewController2
    ]
}()
//end

override func viewDidLoad() {
    super.viewDidLoad()
    self.delegate = self
    self.dataSource = self

    //set up the initial viewController
    setViewControllers([subViewControllers[0]], direction: .forward, animated: true, completion: nil)
}


//set up the before view
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

    packIndex -= 1
    if(packIndex <= 0){
        return nil
    }
    else{
        if thePack[packIndex].article != ""{
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen1") as! ViewController1
        }

        else{
        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen2") as! ViewController2
        }
    }
}

//set up the after view
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

    packIndex += 1

    if(packIndex >= thePack.count){
        return nil
    }
    else{
        if thePack[packIndex].article != ""{
            return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen1") as! ViewController1
        }

        else{
            return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen2") as! ViewController2
        }
    }
}

//change the transition style so it's not the page curl
required init?(coder: NSCoder) {
    super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
}


//MARK UIPageViewController DataSource
func presentationCount(for pageViewController: UIPageViewController) -> Int {
    return subViewControllers.count
}

}

1 Ответ

0 голосов
/ 20 сентября 2018

добро пожаловать в SO!

Во-первых, ваш подход верен, но основная проблема в том, что эти методы из UIPageViewController не вызываются так, как вы могли бы ожидать, дело в том, что если вы аккуратно прокрутите один из них.Контроллер представления (поэтому он будет прокручивать назад, а не переходить на следующую позицию), он вызовет один метод, вероятно, с viewControllerAfter, но не будет вызывать другой, когда представление прокручивается назад, что испортит ваш индекс.Я не уверен на 100%, что это ваша проблема, но из реализации кажется, что я предлагаю создать суперкласс для всех ваших контроллеров представления, которые отображаются в UIPageViewController, и удерживать индекс страницы на них.И используйте страницу с контроллерами, чтобы вычислить вашу позицию.Примерно так

class MyPageViewController: UIViewController {
    var page: Int = 0
}

class OneControllerThatWillBeDisplayed: MyPageViewController {
   // do adittional things here
}


class ThePageViewController ...delegates here {

//set up the before view
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
    let theController = viewController as! MyPageViewController
    let theIndex = theController.page - 1
    if(theIndex < 0){
        return nil
    }
    else{
        if thePack[theIndex].article != ""{
            let theController =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen1") as? MyPageViewController
            theController.page = theIndex
            return theController
        }

        else{
            let theOtherOne  =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen2") as! MyPageViewController
            theOtherOne.page = theIndex
            return theOtherOne
        }
    }
}

//set up the after view
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

    let theController = viewController as! MyPageViewController
    let theIndex = theController.page + 1
    if(theIndex >= thePack.count){
        return nil
    }
    else{
        if thePack[theIndex].article != ""{
            let theController =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen1") as? MyPageViewController
            theController.page = theIndex
            return theController
        }

        else{
            let theOtherOne  =  UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "screen2") as! MyPageViewController
            theOtherOne.page = theIndex
            return theOtherOne
        }
    }
}

И в конце один небольшой совет от моей стороны, будьте осторожны с «кастомными» контроллерами от Apple, большинство из которых действительно дурацкие и их трудно настроить, в этой категорииследующее: UIPageViewController, UITableViewController & UISplitViewController.По моему мнению, Apple следует лучше создавать прототипы этих контроллеров, чтобы больше помогать разработчикам, но, в конце концов, это только мое мнение

...