gpt4 book ai didi

ios - 在 UIPageViewController (Swift) 中可靠地跟踪页面索引

转载 作者:行者123 更新时间:2023-11-28 05:49:22 26 4
gpt4 key购买 nike

问题:

我有一个主控 UIPageViewController (MainPageVC),带有三个嵌入式页面 View (AB、& C) 可通过轻扫手势和按 MainPageVC 中自定义页面指示器*中的适当位置访问(*不是真正的 UIPageControl 但由三个 ToggleButton 组成 - UIButton 的简单重新实现,成为一个切换按钮)。我的设置如下:

Schematic of my view hierarchy

往期阅读: 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 调用,并手动跟踪当前页面索引,但我发现这不能处理某些边缘情况。

我一直在尝试提供一种安全的方式来跟踪当前页面索引(使用 didFinishAnimatingwillTransitionTo 方法)但是我在处理边缘情况时遇到了问题用户在 View A 中,然后一直滑动到 C(没有抬起手指),然后越过 C,然后松开他们的手指...在这种情况下 didFinishAnimating 没有被调用,应用程序仍然认为它在 A 中(即 A 切换viewControllerBeforeviewControllerAfter 方法未正确更新按钮,并且 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 中的某些内容,它可能会导致应用程序致命崩溃否则应保证存在,并抛出意外的 nilindexOutOfBounds 错误。

最佳答案

问题写得很好。特别是对于一个新手。 (投票。)您清楚地说明了您遇到的问题,包括插图和您当前的代码。

我在另一个线程中提出的解决方案是子类化 UIPageControl 并让它在其 currentPage 属性上实现 didSet。然后,您可以让页面控件将当前页面索引通知给 View Controller 。 (通过为您的自定义子类提供委托(delegate)属性、发送通知中心消息或任何最适合您需要的方法。)

(我对这种方法做了一个简单的测试并且它起作用了。但是我没有进行详尽的测试。)

UIPageViewController 可靠地更新页面控件,但没有可靠、明显的方法来确定当前页面索引这一事实似乎是此类设计中的疏忽。

关于ios - 在 UIPageViewController (Swift) 中可靠地跟踪页面索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53446854/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com