转到View Controller后的PageViewController

时间:2017-01-13 03:32:27

标签: ios swift uipagecontrol

我有一个带有3个viewControllers的pageViewController,它嵌入在viewcontroller的视图中。

enter image description here

我以编程方式设置视图控制器:

lazy var vcArr: [UIViewController] =  {
    return [self.vcInstance(name: "vc1"),
            self.vcInstance(name: "vc2"),
            self.vcInstance(name: "vc3"),
            ]
}()

我以编程方式将页数设置为4

    let pageController = UIPageControl.appearance()
        pageController.numberOfPages = 4

我想要发生的是,如果用户尝试从第3页向右滑动,它将转到注册viewController。

我正在尝试在功能测试后在viewcontroller中实现这一点,下一项大于或等于总数。

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

    if nextIndex >= vcArr.count {

        infoClick()

        return nil

    } else {

        guard nextIndex < vcArr.count else {
            return self.vcArr.last
        }
        guard self.vcArr.count > nextIndex else {
            return nil
        }
        return self.vcArr[nextIndex]
    }
}

使用此测试的方式有时它会在第3页停止,然后向右滑动它将使用我的函数infoClick()进行调整。但是有些事情会因为它的&gt; = 页面的数量为3而在第3页上显示出来。

当我将其更改为&gt;它不会在第三页上显示任何内容。

enter image description here enter image description here

我已经搜索了大量的方法,但无济于事。有没有人有任何想法如何实现这一目标?

在下面附上整个班级:

import UIKit
import Parse

class pageViewController: UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {


    @IBOutlet var createAccountBarButton: UIBarButtonItem!


    lazy var vcArr: [UIViewController] =  {
        return [self.vcInstance(name: "vc1"),
                self.vcInstance(name: "vc2"),
                self.vcInstance(name: "vc3"),
                ]
    }()

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }


    //---------------------------------------------- autoLogin


    /// temporary location, needs to be launched during the loading screen
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(true)

//        if (PFUser.current() != nil) {
//            let vc = self.storyboard!.instantiateViewController(withIdentifier: "PackViewController")
//            self.present(vc, animated: true, completion: nil)


//        if (PFUser.current() != nil) {
//            let tbc = self.storyboard!.instantiateViewController(withIdentifier: "MyTabController") as! UITabBarController
//                tbc.selectedIndex = 1
//            self.present(tbc, animated: true, completion: nil)
//        }
    }


    //---------------------------------------------- set the viewcontrollwe instance

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

    }


    //---------------------------------------------- set the direction and first page of the page controller

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tabBarController?.tabBar.isHidden = true

        let pageController = UIPageControl.appearance()
            pageController.pageIndicatorTintColor = UIColor.lightGray
            pageController.currentPageIndicatorTintColor = GeneralFunctions.UIColorFromHEX(hexValue: 0xbb0d2a)
            pageController.backgroundColor = UIColor.clear
            pageController.bounds = CGRect(x: 0, y: 0, width: 0, height: 0)
            pageController.numberOfPages = 4

        //GeneralFunctions.commonButtonSettings(buttonName: signUpButton, hexValue: 0x0c1537)

        self.dataSource = self
        self.dataSource = self
        if let firstVC = vcArr.first {
            setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
        }
    }


    //---------------------------------------------- page view controller before settings

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

        if previousIndex < 0 {
            return nil
        } else {

            guard previousIndex >= 0 else {
                return self.vcArr.last
            }
            guard self.vcArr.count > previousIndex else {
                return nil

            }
            return self.vcArr[previousIndex]
        }
    }



    //---------------------------------------------- page view controller after settings

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

        if nextIndex >= vcArr.count {

            infoClick()

            return nil

        } else {

            guard nextIndex < vcArr.count else {
                return self.vcArr.last
            }
            guard self.vcArr.count > nextIndex else {
                return nil
            }
            return self.vcArr[nextIndex]
        }
    }



    //---------------------------------------------- presentation count

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

    }


    //---------------------------------------------- presentation index

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

        return firstViewControllerIndex
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }



    //---------------------------------------------- launch the new view controller - still launching before swipped to 4th window sometimes

    // not sure if this is the best way to do this need to look at this a bit more

    func infoClick()  {

        let storyboard: UIStoryboard = UIStoryboard (name: "Main", bundle: nil)
        let vc: SignupViewController = storyboard.instantiateViewController(withIdentifier: "SignupViewController") as! SignupViewController
        let currentController = getCurrentViewController()
            currentController?.present(vc, animated: false, completion: nil)

    }

    func getCurrentViewController() -> UIViewController? {

        if let rootController = UIApplication.shared.keyWindow?.rootViewController {
            var currentController: UIViewController! = rootController
            while( currentController.presentedViewController != nil ) {
                    currentController = currentController.presentedViewController
            }
            return currentController
        }
        return nil

    }



}

0 个答案:

没有答案