在 Xcode 预览中启用键盘

Enable Keyboard in Xcode Preview

如何在 Xcode 预览中点击 Textfield 时启用键盘。我以某种方式激活了它并单击了一些键,然后我不小心在 Mac 上输入了一个快捷方式,然后它就消失了。

如何重新启用它?

这可能是一个错误,我尝试在 debug 模式下 运行 预览,在一些情况下,我注意到当点击文本字段时,控制台会抛出一些错误不满足且无法访问它们的约束。

我还从 Xcode 的 "Debug" 菜单中启用了 "Show View Frames",键盘框架实际上出现在屏幕上但由于某种原因没有显示。在极少数情况下,约束错误会无缘无故地消失并且键盘已成功显示,但只是重新启动预览会导致它再次消失。所以这可能是一个错误,如果是这样,希望在下一个版本中得到修复。

事实证明,此设置(非常巧妙地)与 iOS 模拟器应用程序中的“连接硬件键盘”首选项相关(在菜单栏中找到 I/O → 键盘 → 连接硬件键盘)。键盘只会出现在“实时预览”模式下,并且使用此设置 已禁用 ,并且 Xcode 会在预览时检测到任何直接键盘输入后立即重置设置有焦点(模拟器应用程序将 不会 反映此重置,因此要再次执行此操作,您必须将其切换 两次 )。更糟糕的是,仅仅翻转模拟器应用程序中的设置是不够的;您必须强制预览完全重新加载它正在使用的底层模拟器。最简单的方法是重新启动 Xcode 或切换到不同的模拟设备(例如从 iPhone 11 到 iPhone 12)。您也可以尝试在终端中执行此命令:

xcrun simctl --set ~/Library/Developer/Xcode/UserData/Previews/Simulator\ Devices shutdown all

此命令不会影响 iOS 模拟器应用程序中的任何模拟器 运行,但 导致所有预览停止工作,直到 Xcode 重新启动模拟设备,并可能导致 Xcode 的 UI 暂时表现异常(或者至少当我在 Xcode 12.4 中尝试时效果是暂时的)。

设置生效后,将焦点放在文本输入字段上会导致出现软件键盘区域。该区域对点击有反应并且所有按键都有效,但键盘本身似乎没有呈现。这显然不是故意的,以后可能随时停止工作。

Xcode 中实时预览 运行 的解决方法在物理 iPhone 设备上预览应用程序

  1. 将 Xcode 预览应用程序发送到后台(例如通过从屏幕底部向上滑动以查看应用程序切换器)。
  2. 将 Xcode 预览应用程序重新置于前台。

您可能需要多久使用一次上述解决方法?

在每次完全构建之后,但可能不会在每次部分重新构建之后, SwiftUI 实时预览。

测试时间:

  • MacBook Pro(Retina,13 英寸,2013 年末)运行 macOS Big Sur 版本 11.6
  • Xcode 版本 13.0
  • iPhone X 运行 iOS 15.0.1

编辑:我发现了一个密切相关的错误

有一个密切相关的错误会阻止 SwiftUI 视图的 @FocusState 属性(如果有)的值正确更新以响应其 TextField 被点击 - 即使在上述解决方法时也是如此已成功用于在点击 TextField 时显示屏幕键盘 - 提供 SwiftUI View 是 top-level View预览。

请参阅下面的此错误演示以及如何解决此错误的示例:

    struct MyForm: View {
      @FocusState private var isFocused: Bool
      @State private var text = ""
    
      var body: some View {
        VStack {
          Text("isFocused: \(isFocused ? "true" : "false")")
          Form {
            TextField("Enter text here", text: $text)
              .focused($isFocused)
          }
        }
      }
    }
    
    struct Bad_MyForm_Previews: PreviewProvider {
      static var previews: some View {
        /*
         * Due to another bug, paired with the fact that MyForm is the top-level
         * SwiftUI View in this Preview, the value of MyForm's `@FocusState`
         * property won't update in response to its TextField being tapped.
         * This is the case, regardless of if this Preview is being run as:
         *   1. A "Live Preview" in the Canvas in Xcode,
         *   2. Or as a "Preview on Device" via the "Xcode Previews" app on a
         *    physical iPhone - even if the keyboard shows.
         */
        MyForm()
      }
    }
    
    struct Good_MyForm_Previews: PreviewProvider {
      static var previews: some View {
        /*
         * But the bug mentioned above that prevents the value of `MyForm`'s
         * `@FocusState` property from correctly updating in response to its
         * TextField being tapped, *won't* affect *this* Preview, as in *this*
         * Preview, `MyForm` is *not* the top-level SwiftUI View.
         */
        ZStack {
          MyForm()
        }
      }
    }