Передача данных в UIPageViewController между различными видами пролистывания - PullRequest
0 голосов
/ 30 октября 2018

Я работаю над проектом с 3 видами, доступ к которым осуществляется с помощью смахивания.

Следующий код реализует PageViewController, который я использую для обработки движения смахивания:

import UIKit

class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

    lazy var orderedViewControllers : [UIViewController] = {
        return [self.newVC(viewController : "ClimaVC"),
            self.newVC(viewController : "WeatherVC"),
            self.newVC(viewController : "ClosetVC")]
    }()

    var myViewControllers = [UIViewController]()

    var currentIndex : Int = 0


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.

        self.dataSource = self

        setViewControllers([orderedViewControllers[1]],
                           direction: .forward, animated: true, completion: nil)

        self.delegate = self
    }


    func newVC(viewController : String) -> UIViewController {

        return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: viewController)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

        guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
            return nil
        }

        let previousIndex = viewControllerIndex - 1;

        guard previousIndex >= 0 else {
            // return orderedViewControllers.last
            //Return nil to avoid swiping forever.
            return nil
        }

        guard orderedViewControllers.count > previousIndex else {
            return nil
        }

        currentIndex = previousIndex

        return orderedViewControllers[previousIndex]
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

        guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
            return nil
        }

        let nextIndex = viewControllerIndex + 1;

        guard orderedViewControllers.count != nextIndex else {
            //return orderedViewControllers.first
            //Return nil to avoid swiping forever.
            return nil
        }

        guard orderedViewControllers.count > nextIndex else {
            return nil
        }

        return orderedViewControllers[nextIndex]
    }
}

Основной контроллер вида: WeatherVC . В этом представлении данные времени извлекаются и сохраняются в целочисленной переменной с именем timeOfDay .

В зависимости от значения timeOfDay отображаемый фон будет отличаться. Хотя я смог использовать эту переменную в WeatherVC , мне нужно передать эту переменную timeOfDay двум другим контроллерам представления ClimaVC и ClosetVC .

Я попытался настроить протокол делегата, но потерпел неудачу, исследовал с использованием различных функций, предоставляемых UIPageViewControllerDelegate, и это никуда меня не привело.

Буду очень признателен за помощь,

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

Возможно, вам следует попытаться объяснить, что не удалось настроить протокол вашего делегата, потому что кажется, что это, скорее всего, решение, которое вы ищете. Я пишу протокол для справки, но вы должны изменить его в соответствии с вашими потребностями.

protocol WeatherVCDelegate {
    func changedTime(timeOfDay: Int)
}

Здесь начинается сложная часть. Когда вы объявляете делегата в WeatherVC, вам нужно использовать делегат для вызова функции, чтобы передать timeOfDay другому weatherVC. Как это работает, так это то, что все, что соответствует протоколу делегата, будет запущено для использования функции.

class WeatherVC {
    weak var delegate: WeatherVCDelegate?

func functionName() {
    delegate?.changedTime(timeOfDay: value)
}

Теперь, когда вы инициализируете weatherVC в вашем PageViewController, вам нужно, чтобы PageViewController соответствовал делегату weatherVC.

In PageViewController...
weatherVC.delegate = self
extension PageViewController: WeatherVCDelegate {
     ...
}

Вот больше информации о делегатах, если мой ответ недостаточно ясен https://medium.com/@jamesrochabrun/implementing-delegates-in-swift-step-by-step-d3211cbac3ef

0 голосов
/ 30 октября 2018

Это не сложно, просто присвойте значения источникам данных pageviewcontroller.

        import UIKit

                    class ClimaViewController: UIViewController{
            var timeOfDayClima: Int = 0

            override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(animated)
                print (timeOfDayClima)
            }
        }

        class WeatherViewController: UIViewController{
            var timeOfDayClima: Int = 0


            override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(animated)
               timeOfDayClima +=  1
            }
        }

        class ClosetViewController: UIViewController{
            var timeOfDayClima: Int = 0

            override func viewDidAppear(_ animated: Bool) {
                super.viewDidAppear(animated)
                print (timeOfDayClima)
            }
        }
        class PageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {

            lazy var orderedViewControllers : [UIViewController] = {
                return [self.newVC(viewController : "ClimaVC"),
                        self.newVC(viewController : "WeatherVC"),
                        self.newVC(viewController : "ClosetVC")]
            }()

            var myViewControllers = [UIViewController]()

            var currentIndex : Int = 0


            override func viewDidLoad() {
                super.viewDidLoad()

                // Do any additional setup after loading the view.

                self.dataSource = self

                setViewControllers([orderedViewControllers[1]],
                                   direction: .forward, animated: true, completion: nil)

                self.delegate = self


            }


            func newVC(viewController : String) -> UIViewController {

                return UIStoryboard(name: "Second", bundle: nil).instantiateViewController(withIdentifier: viewController)


            }

            func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {

                //Guard = some kind of if statement.
                guard let viewControllerIndex = orderedViewControllers.index(of: viewController) else {
                    return nil
                }



                let previousIndex = viewControllerIndex - 1;



                guard previousIndex >= 0 else {
                    // return orderedViewControllers.last
                    //Return nil to avoid swiping forever.
                    return nil
                }

                guard orderedViewControllers.count > previousIndex else {
                    return nil
                }

                currentIndex = previousIndex


                if(currentIndex == 0) {
                    (orderedViewControllers.first as! ClimaViewController).timeOfDayClima = (orderedViewControllers[1] as! WeatherViewController).timeOfDayClima
                }

                return orderedViewControllers[previousIndex]

            }

            func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {

                //Guard = some kind of if statement.
                guard let viewControllerIndex = orderedViewControllers.index(of: viewController)
                    else {
                        return nil
                }

                let nextIndex = viewControllerIndex + 1;

                guard orderedViewControllers.count != nextIndex else {
                    //return orderedViewControllers.first
                    //Return nil to avoid swiping forever.
                    return nil
                }

                guard orderedViewControllers.count > nextIndex else {
                    return nil
                }

                currentIndex = nextIndex
                if(currentIndex == orderedViewControllers.count - 1) {
                    (orderedViewControllers.last as! ClosetViewController).timeOfDayClima = (orderedViewControllers[1] as! WeatherViewController).timeOfDayClima
                }


                if(nextIndex == 0) {
                    let secondVC = self.storyboard?.instantiateViewController(withIdentifier: "ClimaVC") as! ClimaViewController
                    secondVC.timeOfDayClima = 1
                }

                return orderedViewControllers[nextIndex]

            }

            override func didReceiveMemoryWarning() {
                super.didReceiveMemoryWarning()
                // Dispose of any resources that can be recreated.
            }


        }
...