所以我现在正在使用某个应用程序,此应用程序的其中一个规格是在特定页面上的视图功能之间轻扫,就像Instagram上的相机一样。
我目前的解决方案是将初始视图控制器设置为UIPageViewController,它有两个视图控制器,一个是整个应用程序的主标签栏控制器(第一个图像),第二个视图控制器是图像中以粉红色显示的控制器上面,然后启用和禁用PageViewController的滑动功能,具体取决于当前视图是否可以访问第二个粉红色'查看控制器。 (PS打开一个完全不同的架构,如果有人知道一个,这是我能做的最好的,因为我对iOS的知识有限)
通常情况下,每件事情都可以。但是,当我以非常特殊的模式移动我的手指时,整个应用程序停止运行。模式如下所示:
模式基本上是:
向左轻轻向左滑动,直到第二个粉红色的部分为止。视图控制器正在显示(上面的图像2)
快速向右滑动,导致主视图控制器左侧的空白区域显示(图3)
快速放手让主视图控制器回到原位(图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)
除非我按照上面描述的模式进行滑动,否则会打印出真实和错误,在这种情况下,它甚至从未触发过该方法并且根本不打印任何内容。