用户如何在不直接点击标签的情况下更改标签?

问题描述

我遇到了一个非常棘手的错误,在设备和模拟器上使用了大量时间后(不清楚何时),点击屏幕上的任何地方都会让我回到标签标签中的第一个/顶部标签.该应用的粗略布局如下:

schematic of the app

对于第一个/顶部选项卡,用户通过三个场景,在完成第三个场景后,最后两个被弹出,用户返回到根场景(导航控制器堆栈中的第一个)。我可以确认没有内存泄漏,至少对于这些控制器。后两者被弹出并明显取消分配。

在第二个/中间选项卡中,控制器包含一个容器视图,其中包含一个带有多个控制器的 UIPageViewController。

第三个选项卡是最简单的,它是一个带有单个详细信息视图的 TableViewController。

所有三个选项卡都以某种方式引用了基本选项卡栏控制器,我在这里放置了一个公共存储对象,每个选项卡都可以读/写。

在应用程序中按下第一个选项卡来清除循环场景没有意义,所以我在基本 UITabBarController 中实现了一个检查,当已经在该选项卡上时阻止清除它,否则返回 true :

func tabBarController(
        _ tabBarController: UITabBarController,shouldSelect viewController: UIViewController
    ) -> Bool {
        guard let vc = selectedViewController else {
            fatalError(
                "TabBarController should always have a non-nil selectedViewController.")
        }
        var result = true

        if let currentVC = vc as? UINavigationController {
            // Block clearing to the base Controller in the Cycle if already in the Cycle.
            if let cvc = currentVC.viewControllers[0] as? CyclicViewController
            {
                let areEqual = viewController.isEqual(currentVC as UIViewController)
                result = !areEqual
            }
        }

        return result
    }

如前所述,经过一段时间后(通常在第一个选项卡中循环视图控制器的至少一两次迭代之后,尽管有时在启动时也是如此),应用程序最终并永久地开始返回到点击屏幕时的第一个选项卡,无论您点击哪个控制器或点击位置。您仍然可以点击返回到其他选项卡,但是点击任何地方都会让您回到第一个选项卡,即使点击当前选项卡也是如此。就好像第一个选项卡并没有真正被关闭,尽管它在调用上述方法时很明显。

我可以确认上面的 shouldSelect 是通过这些无意的选项卡切换调用的,但这是唯一讨论过在选项卡之间切换的代码代码库中的其他任何地方都没有说有条件地或以其他方式切换到另一个选项卡的代码

我的代码库中的任何地方都没有线程代码。一切都在主线程上运行。

selectedViewController 属性被分配给位于标签栏控制器 viewDidLoad 的第一个/顶部标签处的视图控制器。

我希望能够重现这一点,但似乎无法重现,否则我会使用一个更简单的示例。我知道我没有展示太多,但我宁愿不展示比我拥有的更多。设置断点是一个巨大的痛苦,即使有很大的限制 - 我不知道如何可靠地重现这个错误,所以很难输入一个数字,而且断点使用起来很烦人。

关于点击手势识别器 - 带有 PageViewController 的中间选项卡通过具有点击手势识别器的对象翻阅多个 ViewController。我可以在我的工作区中使用 grep -R "ecognizer" 确认我自己有零敲击手势识别器。至关重要的是,该问题也会影响第三个选项卡,该选项卡从不使用点击手势识别器。

看到这个我有点发疯了,所以任何能澄清为什么标签可能会切换的人都会非常感激,尽管很明显没有点击另一个标签

对于规格,我在 MacBook Pro (macOS Catalina) 上运行,使用 Xcode 12.4,在 iPhone SE 2nd Gen 和 iPhone 12(均模拟)和 iPhone 7(真实)上运行 iOS 14.1。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)