为什么我收到此消息:[SystemGestureGate] <0x102210320> 手势:系统手势门超时

问题描述 投票:0回答:2

我的 iOS Swift 5 (Xcode 14.1) 应用程序正在运行。上次 Xcode 更新后,我注意到当我在导航控制器内的堆栈内推送带有表视图的特定视图控制器时,我收到以下警告:

[SystemGestureGate] <0x102210320> 手势:系统手势门超时

当我向后滑动以弹出有问题的视图控制器时,它的行为不稳定,有时弹出得很好。我所说的“不稳定”是指有时它会部分显示目标视图控制器,有时会在滑动中间冻结一两秒等。当我尝试再次推入有问题的视图控制器时(出现警告后),它冻结了应用程序。

视图控制器、堆栈、表格和单元格没有自定义手势识别器。

我在应用程序的其他任何地方都没有看到此警告(包括带有堆栈和表格的视图控制器)。

我的问题是:

  1. 什么是“SystemGestureGate:系统手势门超时”?我在网上没有找到关于这个错误的实质性信息。
  2. 什么条件会产生这样的警告?

我怀疑我正在使用的桌子有问题,正在进一步调查。

我采取的一些故障排除步骤:

  • 当我完全删除桌子时,警告和行为就会消失。
  • 当我部分删除表格(一两个部分)时,警告和行为会随机发生(我找不到模式)。
  • 我放置了断点,发现错误发生在
    viewWillAppear
    之后,但在
    viewDidAppear
    之前。

我希望视图控制器能够通过与导航控制器中所有其他视图控制器相同的方式滑动来弹出。

ios swift uigesturerecognizer
2个回答
27
投票

我今天遇到了同样的错误。它似乎是在长按屏幕底部附近的按钮(或可能是任何手势处理元素)时发生的。

这是我测试过的一个愚蠢的视图:

struct vertButtons: View {
  @State var i = 0
  func action() {i=(i+1)%10}
  var body: some View {
    VStack {
        Text(String(i))
            .font(.title)
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("Good Button") // This one is fine
                .font(.title)
        }
        Spacer()
        Button(action: {action()}) {
            Text("\"Bad\" Button") // Long-press produces "gesture gate timeout"
                .font(.title)
        }
    }
  }
}

长按“坏”按钮会产生错误(“手势:系统手势门超时”),而对任何“好”按钮执行相同操作则不会。计数器文本的作用是证明错误消息不会干扰长按释放后执行的按钮操作。

我最好的猜测是,iOS 包含或包含了一些功能(“系统手势门”),旨在防止应用程序手势处理和屏幕底部的特殊系统手势之间的干扰,并且最近的 iOS 更新引入了一个错误该功能导致它超时而不是执行它应该执行的操作。

该错误对该测试视图或我的实际应用程序中的预期功能没有影响,所以我想知道您的问题是否还有其他原因。

我希望我能给出更权威的答案,但希望这对你有帮助。需要注意的是,我对 Swift 和 SwiftUI 还很陌生。


0
投票

以我为例,我发现延迟的根本原因以及以下警报

 <0x107f0e4f0> Gesture: System gesture gate timed out.

由于以下原因:

 @Environment(\.presentationMode) var presentationMode

此消息表示存在与系统手势相关的超时,可能是因为演示模式环境值未被忽略或正确管理,导致系统手势处理花费的时间比预期更长。

要解决此问题,您可以使用替代方法来关闭视图。

© www.soinside.com 2019 - 2024. All rights reserved.