UISearchBar 警告:UITextEffectsWindow 不应成为关键。请向键盘 | 提交错误 iOS 具有此调用堆栈

Pra*_*y C 6 uitextview uisearchbar ios swift

我在使用以下方式呈现的视图中有一个 UISearchBar:

\n
view.addSubview(searchView)\nsearchView.mySearchBar.becomeFirstResponder()\n
Run Code Online (Sandbox Code Playgroud)\n

如果我只是在搜索栏中输入文本而不触摸它,那么在大多数情况下这都可以正常工作。但是,如果我点击搜索栏(假设将光标放在另一个位置或复制/粘贴文本等),那么 Xcode 会打印以下警告:

\n
[Assert] UITextEffectsWindow should not become key. Please file a bug to Keyboard | iOS with this call stack: (\n    0   UIKitCore                           0x0000000190cd3e14 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 14769684\n    1   UIKitCore                           0x0000000190a2e028 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 11993128\n    2   UIKitCore                           0x0000000190c98ca8 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 14527656\n    3   UIKitCore                           0x0000000190c77510 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 14390544\n    4   UIKitCore                           0x0000000190c780c4 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 14393540\n    5   UIKitCore                           0x00000001909e5d54 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 11697492\n    6   UIKitCore                           0x00000001904d0f1c 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 6369052\n    7   UIKitCore                           0x0000000190568a4c 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 6990412\n    8   UIKitCore                           0x0000000190571fc0 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 7028672\n    9   UIKitCore                           0x000000019056ec48 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 7015496\n    10  UIKitCore                           0x000000019056e210 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 7012880\n    11  UIKitCore                           0x00000001905627a0 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 6965152\n    12  UIKitCore                           0x0000000190561b30 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 6961968\n    13  UIKitCore                           0x0000000190a22534 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 11945268\n    14  UIKitCore                           0x00000001909fd934 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 11794740\n    15  UIKitCore                           0x0000000190a7fa20 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 12327456\n    16  UIKitCore                           0x0000000190a841c0 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 12345792\n    17  UIKitCore                           0x0000000190a7b480 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 12309632\n    18  CoreFoundation                      0x000000018e120240 F80FCA31-BF76-3293-8BC6-1729588AE8B6 + 631360\n    19  CoreFoundation                      0x000000018e120140 F80FCA31-BF76-3293-8BC6-1729588AE8B6 + 631104\n    20  CoreFoundation                      0x000000018e11f488 F80FCA31-BF76-3293-8BC6-1729588AE8B6 + 627848\n    21  CoreFoundation                      0x000000018e119a40 F80FCA31-BF76-3293-8BC6-1729588AE8B6 + 604736\n    22  CoreFoundation                      0x000000018e119200 CFRunLoopRunSpecific + 572\n    23  GraphicsServices                    0x00000001a4214598 GSEventRunModal + 160\n    24  UIKitCore                           0x00000001909df004 00EA1426-38F7-3FD2-BE01-04EBD44ECA35 + 11669508\n    25  UIKitCore                           0x00000001909e45d8 UIApplicationMain + 164\n    26  APPNAME                             0x0000000100423468 main + 88\n    27  libdyld.dylib                       0x000000018ddf8598 77E57314-8A58-3064-90C0-8AF9A4745430 + 5528\n)\n
Run Code Online (Sandbox Code Playgroud)\n

应用程序不会崩溃,但在此错误之后,如果我使用 Xcode 的调试器打印当前的 keyWindow,它会设置为UITextEffectsWindow(如错误警告所示)。

\n
(lldb) po UIApplication.shared.keyWindow\n\xe2\x96\xbf Optional<UIWindow>\n  - some : <UITextEffectsWindow: 0x135ede920; frame = (0 0; 375 667); opaque = NO; autoresize = W+H; layer = <UIWindowLayer: 0x2815009e0>>\n
Run Code Online (Sandbox Code Playgroud)\n

这会导致任何进一步的视图控制器演示使用UIApplication.shared.keyWindow?.rootViewControllerself.present失败,因为 keyWindow 是UITextEffectsWindow而不是我的 AppDelegate\ 的窗口。

\n

我真的不知道为什么会发生这种情况。我不会在应用程序中的任何地方摆弄 keywindow。

\n

解决此问题的解决方案是我可以使用以下方法将 keywindow 设置回我的 AppDelegate\ 的窗口:

\n
(UIApplication.shared.delegate as? AppDelegate)?.window?.makeKeyAndVisible()\n
Run Code Online (Sandbox Code Playgroud)\n

事情开始顺利进行。不过,我更希望有一个适当的解决方案,而不是这种解决方法。我觉得UITextEffectsWindow是 iOS 13 中引入的用于处理撤消和重做打字等手势的功能,但我可能是错的:

\n

https://ios.gadgethacks.com/how-to/undo-redo-typing-with-ios-13s-new-gestures-0201481/

\n
    \n
  1. 有办法防止这种情况吗?

    \n
  2. \n
  3. 如果没有,有没有办法禁用撤消/重做手势?

    \n
  4. \n
\n

请注意,我认为这个应用程序是在 iOS 11 期间开发的,并且它没有 SceneDelegate 内容(除非 Xcode 在项目升级时以某种方式添加了它)。

\n

编辑:我找到了以下方法来禁用 iOS 13 手势:

\n

https://www.hackingwithswift.com/example-code/uikit/how-to-disable-undo-redo-copy-and-paste-gestures-using-editinginteractionconfiguration

\n
extension UITextField {\n    @available(iOS 13.0, *)\n    open override var editingInteractionConfiguration: UIEditingInteractionConfiguration {\n        print("editingInteractionConfiguration!!!!!!!!!!!")\n      return .none\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这确实打印了我的断点,但UITextEffectsWindow should not become key.警告仍然记录在控制台中。所以也许问题出在其他方面。

\n