UIPageViewController上非常特定的滑动模式会破坏我的整个应用

时间:2017-11-17 03:12:36

标签: ios swift uipageviewcontroller

所以我现在正在使用某个应用程序,此应用程序的其中一个规格是在特定页面上的视图功能之间轻扫,就像Instagram上的相机一样。

enter image description here

我目前的解决方案是将初始视图控制器设置为UIPageViewController,它有两个视图控制器,一个是整个应用程序的主标签栏控制器(第一个图像),第二个视图控制器是图像中以粉红色显示的控制器上面,然后启用和禁用PageViewController的滑动功能,具体取决于当前视图是否可以访问第二个粉红色'查看控制器。 (PS打开一个完全不同的架构,如果有人知道一个,这是我能做的最好的,因为我对iOS的知识有限)

通常情况下,每件事情都可以。但是,当我以非常特殊的模式移动我的手指时,整个应用程序停止运行。模式如下所示:

enter image description here

模式基本上是:

  1. 向左轻轻向左滑动,直到第二个粉红色的部分为止。视图控制器正在显示(上面的图像2)

  2. 快速向右滑动,导致主视图控制器左侧的空白区域显示(图3)

  3. 快速放手让主视图控制器回到原位(图4)

  4. (*编辑 - 可能值得注意的是,如果我慢慢地做同样的模式,而不是快速向右滑动,让一切都运转正常)

    (PS,如果有上传屏幕录制的方式让我知道)

    无论如何,如果我这样做一次,我的整个应用程序都会停止工作。基本上每个页面都停止加载数据,每当我点击主页面上的按钮(例如图像中显示的喜欢按钮)时,我得到一个"非平衡调用来开始/结束AppName.ViewController的外观转换&# 34;并且新的视图控制器显示没有数据。

    此外,只要我滑到第二页粉红色'查看控制器,然后回到主应用程序,一切都恢复正常。

    我真的不知道哪些代码与此问题相关(花了大约5个小时试图弄清楚没有运气),所以我现在要发布我的UIPageViewController类,如果你认为问题来自其他地方让我知道,我会发布该代码。

    // MARK: -> Properties
    class PageViewController: UIPageViewController {
        var pages = [UIViewController]()
    }
    
    // MARK: -> Lifecycle
    extension PageViewController {
        override func viewDidLoad() {
            super.viewDidLoad()
            self.dataSource = self
    
            setViewController(withIdentifier: "MainTabController")
            setViewController(withIdentifier: "SecondaryPage") // The 'Pink' screen
    
            setViewControllers([pages.first!], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
        }
    }
    
    // MARK: -> Helpers
    fileprivate extension PageViewController {
        func setViewController(withIdentifier storyboardIdentifier: String){
            let page: UIViewController! = storyboard?.instantiateViewController(withIdentifier: storyboardIdentifier)
            storyboard?.configure(viewController: page)
            self.pages.append(page)
        }
    }
    
    // MARK: -> UIPageController Data Source
    extension PageViewController: UIPageViewControllerDataSource {
        func presentationIndex(for pageViewController: UIPageViewController)-> Int {
            return pages.count
        }
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
            let cur = pages.index(of: viewController)!
            if cur == 0 { return nil }
            let prev = abs((cur - 1) % pages.count)
            return pages[prev]
        }
        func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
            let cur = pages.index(of: viewController)!
            if cur == (pages.count - 1) { return nil }
            let nxt = abs((cur + 1) % pages.count)
            return pages[nxt]
        }
    }
    

    更新

    不确定这究竟是什么意思,但我确定它是相关的。我将此扩展和方法添加到了我的PageViewController

    extension PageViewController: UIPageViewControllerDelegate {
        func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
            print(completed)
        }
    }
    

    (然后显然在viewDidLoad中将委托设置为self)

    除非我按照上面描述的模式进行滑动,否则会打印出真实和错误,在这种情况下,它甚至从未触发过该方法并且根本不打印任何内容。

0 个答案:

没有答案