在UIPageView中更新标签

时间:2017-02-13 08:52:43

标签: swift uipageviewcontroller

Xcode/Swift相对较新,但在其他语言方面有一定经验。

我正处于应用程序的初期阶段,并且正在尝试实现以下功能:

UIPageView环境中,当用户向前滑动时,标签(其值为整数)会增加1.当用户向后滑动时,标签会减1。

我有一个UIViewController作为故事板ID PageContentViewController的内容页面。

基本上,我的想法是声明一个最初设置为0的整数变量,然后创建一个swipedBack()swipedRight()函数,它更新变量的值,然后设置标签的文本。 PageContentViewController到该变量的值。然后函数返回新的PageContentViewController

我得到了一些特殊的行为。也就是说,应用程序正在构建并正常运行。

初始屏幕加载标签为0.然后我向前滑动,然后更新为1.但是......如果我再次向前滑动,标签保持为1。但是......如果我继续前进,它会按照需要行动 - 转到2,然后转到3.然后如果我反转方向,它会变得更加奇特。

如果我的值为4,则向后滑动,它将减少到3.但是再次向后滑动它将返回到4,然后继续滑动,它将按预期运行(4,3 ,2,1 ......)。我显然有一个概念上的误解,并希望得到一些帮助。

这是我的代码:

import UIKit

class ViewController: UIPageViewController, UIPageViewControllerDataSource {

    var arrPageTitle: NSArray = NSArray()

    var t: Int = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        self.dataSource = self

        self.setViewControllers([getViewControllerAtIndex()] as [UIViewController], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
    }

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

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

    func getViewControllerAtIndex() -> PageContentViewController {  
        let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController

        pageContentViewController.strTitle = "\(t)"
        return pageContentViewController
    }

    func swipedForward() -> PageContentViewController {

        let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController

        t = t + 1

        pageContentViewController.strTitle = "\(t)"
        return pageContentViewController

    }

    func swipedBack() -> PageContentViewController {

        let pageContentViewController = self.storyboard?.instantiateViewController(withIdentifier: "PageContentViewController") as! PageContentViewController

        t = t - 1
        pageContentViewController.strTitle = "\(t)"
        return pageContentViewController

    }

}

1 个答案:

答案 0 :(得分:1)

我认为这可能是因为一旦你改变方向,最近的UIViewController仍然在内存中,因此不会调用委托函数。

我建议改用pageViewControllerWillTransitionTo功能。每次刷卡时都应该调用此方法。同样,如果您希望在滑动后进行调用,则可以使用pageViewControllerDidFinishAnimating

为了检测您滑动的方向,您可以尝试同时使用UISwipeGestureRecognizer,并调用将递增/递减变量值的函数。实际上,现在我考虑一下,你可能只能在没有委托功能的情况下使用这个手势识别器。由你决定。