【问题标题】:UIPageViewController does not advance with setViewControllersUIPageViewController 不与 setViewControllers 一起前进
【发布时间】:2018-01-29 15:00:12
【问题描述】:

我有一个 UIPageViewController 有两个 UIViewControllers 作为孩子。我希望用户能够在子视图之间进行分页,但我也希望能够自动调用页面。

我已经尽我所能尝试了使用 setViewControllers 的每一种排列方式,但它们都不能在程序控制下推进页面。

我觉得我必须在这里遗漏一些基本的东西,但我看不到它。

这是代码。

    import UIKit
    import Alamofire
    import SwiftyJSON
    import SVProgressHUD

    class auiPrefsPageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

        lazy var auiPrefsControllers: [UIViewController] = {
            return [self.auiPrefsControllerInstance(name: "auiURLPrefs"), self.auiPrefsControllerInstance(name: "auiCredentialsPrefs")]

        }()

        private func auiPrefsControllerInstance(name: String) -> UIViewController {
            return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: name)

        }

        public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            guard let viewControllerIndex = auiPrefsControllers.index(of: viewController) else {
                return nil

            }

            let previousIndex = viewControllerIndex - 1

            guard previousIndex >= 0 else {
                return nil

            }

            guard auiPrefsControllers.count > previousIndex else {
                return nil
            }

            return auiPrefsControllers[previousIndex]

        }

        public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
            guard let viewControllerIndex = auiPrefsControllers.index(of: viewController) else {
                return nil

            }

            let nextIndex = viewControllerIndex + 1

            guard nextIndex < auiPrefsControllers.count else {
                return nil

            }

            guard auiPrefsControllers.count > nextIndex else {
                return nil

            }

            return auiPrefsControllers[nextIndex]

        }

        public func presentationCount(for pageViewController: UIPageViewController) -> Int {
            return auiPrefsControllers.count

        }

        public func presentationIndex(for pageViewController: UIPageViewController) -> Int {
            guard let firstViewController = viewControllers?.first, let firstViewControllerIndex = auiPrefsControllers.index(of: firstViewController) else {
                return 0
            }

            return firstViewControllerIndex

        }

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

            if let vc1 = auiPrefsControllers.first {
                setViewControllers([vc1], direction: .forward, animated: true, completion: nil)
            }

        }

        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            for view in self.view.subviews {
                if view is UIScrollView {
                    view.frame = UIScreen.main.bounds
                } else {
                    view.backgroundColor = UIColor.clear

                }

            }

        }

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


        func auiPrefsGoNext() {
            let controller = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "auiCredentialsPrefs")
            setViewControllers([controller], direction: .forward, animated: true, completion: nil)
        }

        public func obtainPrimaryURL(mCode: String) {
            SVProgressHUD.show()
            let rString = "ImaURLthatcantbepublic?aparam=" + mCode

            Alamofire.request(rString).responseJSON { response in
                if let result = response.result.value {
                    SVProgressHUD.dismiss()
                    let json = JSON(result)
                    if(json["message"] == "ok") {
                        let mURL: String = json["awhURL"].string!
                        let mAPI: String = json["apiURL"].string!

                        // save URLs
                        let sState = auiCoreDataHandler.saveBaseURL(baseURL: mURL)
                        if (!sState) {
                            let sState = auiCoreDataHandler.saveBaseURL(baseURL: "")

                        }

                        self.auiPrefsGoNext()

                    } else {
                        // handle a return error
                        SVProgressHUD.dismiss()

                        // some actual error handling here

                    }

                }

            }

        }

从这里可以看出,两个重要的位是函数 gainPrimaryURL 和 auiPrefsGoNext。第一个出去并获取一些数据并存储它,然后通过调用 auiPrefsGoNext 尝试前进到下一页。就在这里,我几天来一直在绞尽脑汁并尝试一种又一种方法。底线是它不会引发任何错误,但不会进入下一页。

【问题讨论】:

    标签: ios swift uikit uipageviewcontroller


    【解决方案1】:

    看起来您已经创建了一次 auiCredentialsPrefs 控制器(在 lazy var 中),为什么要在 auiPrefsGoNext 中创建第二次(并且每次)?

    如果这是我的代码,我会这样做:

    func auiPrefsGoNext() {
        let auiCredentialsPrefsController = auiPrefsControllers[1]
        setViewControllers([auiCredentialsPrefsController], direction: .forward, 
                           animated: true, completion: nil)
    }
    

    另外,我看不出在你正在做的地方做lazy var 的好处。

    【讨论】:

    • 惰性变量是我在几乎所有 UIPageViewController 实现中看到的。坦率地说,我不明白为什么在这里使用它。就使用 setViewControllers 而言,我已经尝试过多种方式,包括上述方式。它根本不会在视图之间转换。它同样不会引发错误。
    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多