【发布时间】:2018-11-23 12:37:19
【问题描述】:
问题:
我有一个大师 UIPageViewController (MainPageVC) 和三个嵌入式页面视图(A、B 和 C),可以通过滑动手势和按自定义中的适当位置来访问它们MainPageVC 中的页面指示器*(*不是真正的 UIPageControl,而是由三个 ToggleButtons 组成 - UIButton 的简单重新实现成为切换按钮)。我的设置如下:
以前的阅读:
Reliable way to track Page Index in a UIPageViewController - Swift、A reliable way to get UIPageViewController current index 和 UIPageViewController: return the current visible view
表示最好的方法是使用didFinishAnimating 调用,并手动跟踪当前页面索引,但我发现这不能处理某些边缘情况。
我一直在尝试创建一种安全的方式来跟踪当前页面索引(使用 didFinishAnimating 和 willTransitionTo 方法),但在用户处于视图 A 的边缘情况下遇到了问题,并且然后一直滑动到C(不抬起手指),然后超过C,然后松开手指......在这种情况下didFinishAnimating没有被调用,应用程序仍然认为它是在A 中(即A 切换按钮仍处于按下状态,并且viewControllerBefore 和viewControllerAfter 方法未正确更新pageIndex)。
我的代码:
@IBOutlet weak var pagerView: UIView!
@IBOutlet weak var aButton: ToggleButton!
@IBOutlet weak var bButton: ToggleButton!
@IBOutlet weak var cButton: ToggleButton!
let viewControllerNames = ["aVC", "bVC", "cVC"]
lazy var buttonsArray = {
[aButton, bButton, cButton]
}()
var previousPage = "aVC"
var pageVC: UIPageViewController?
func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) {
print("TESTING - will transition to")
let currentViewControllerClass = String(describing: pageViewController.viewControllers![0].classForCoder);
let viewControllerIndex = viewControllerNames.index(of: currentViewControllerClass);
if currentViewControllerClass == previousPage {
return
}
let pastIndex = viewControllerNames.index(of: previousPage)
if buttonsArray[pastIndex!]?.isOn == true {
buttonsArray[pastIndex!]?.buttonPressed()
}
if let newPageButton = buttonsArray[viewControllerIndex!] {
newPageButton.buttonPressed()
}
self.previousPage = currentViewControllerClass
}
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
print("TESTING - did finish animating")
let currentViewControllerClass = String(describing: pageViewController.viewControllers![0].classForCoder)
let viewControllerIndex = viewControllerNames.index(of: currentViewControllerClass)
if currentViewControllerClass == previousPage {
return
}
let pastIndex = viewControllerNames.index(of: previousPage)
if buttonsArray[pastIndex!]?.isOn == true {
buttonsArray[pastIndex!]?.buttonPressed()
}
if let newPageButton = buttonsArray[viewControllerIndex!] {
newPageButton.buttonPressed()
}
self.previousPage = currentViewControllerClass
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
let onboardingViewControllerClass = String(describing: viewController.classForCoder)
let viewControllerIndex = viewControllerNames.index(of: onboardingViewControllerClass)
let newViewControllerIndex = viewControllerIndex! - 1
if(newViewControllerIndex < 0) {
return nil
} else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: viewControllerNames[newViewControllerIndex])
if let vc = vc as? BaseTabVC {
vc.mainPageVC = self
vc.intendedCollectionViewHeight = pagerViewHeight
}
return vc
}
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
let onboardingViewControllerClass = String(describing: viewController.classForCoder)
let viewControllerIndex = viewControllerNames.index(of: onboardingViewControllerClass)
let newViewControllerIndex = viewControllerIndex! + 1
if(newViewControllerIndex > viewControllerNames.count - 1) {
return nil
} else {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: viewControllerNames[newViewControllerIndex])
if let vc = vc as? BaseTabVC {
vc.mainPageVC = self
vc.intendedCollectionViewHeight = pagerViewHeight
}
return vc
}
}
我不知道如何处理这种边缘情况,问题是如果用户随后尝试按 C 中的某些内容,则可能会导致应用程序的致命崩溃,否则应保证存在,并抛出意外的nil 或indexOutOfBounds 错误。
【问题讨论】:
标签: ios swift uipageviewcontroller uipagecontrol