在 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 设备上预览应用程序
- 将 Xcode 预览应用程序发送到后台(例如通过从屏幕底部向上滑动以查看应用程序切换器)。
- 将 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()
}
}
}
如何在 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 设备上预览应用程序
- 将 Xcode 预览应用程序发送到后台(例如通过从屏幕底部向上滑动以查看应用程序切换器)。
- 将 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()
}
}
}