为什么在 TextField 键盘中输入每个字母后关闭以及如何更好地修复它?
Why after each entered letter in TextField keyboard closes and how to fix it better?
我的父视图和子视图都有 ObservableObject:
import Parchment
class MainViewModel: ObservableObject {
@Published var inputText = String()
init() {}
}
struct ChildView: View {
@EnvironmentObject var viewModel: MainViewModel
var body: some View {
PageView(/**/) {
TextField("", $viewModel.inputText)
}
}
}
}
我尝试将 inputText 放入子视图的 ObservedObject 但没有任何变化。
当我输入一个字母时,键盘关闭。我认为 SwiftUI 开始重绘整个页面,因此 TextField 变得不活动。
如何解决这个问题?也许以某种方式强制激活 TextField,或者启动键盘?
您当前的代码无法在我的 Parchment
和 SwiftUI 的 2.4.0 版本上编译,因此我尝试推断各种细节 - 该代码在本机 SwiftUI 组件中运行良好。我会考虑重新构建代码,以便 @Published
属性 引用模型对象 - 这是更好的 SoC 并且可以更好地共享(鉴于你的 EnvironmentObject
我怀疑你正在通过此视图模型到多个视图)。
如@Asperi 所述,Parchment 并不理想。 PageView
包装了一个 UIViewController
作为分页控制器,每个页面都嵌套在另一个 UIHostingController
中!更好的方法是使 PagingController
为符合 UIViewControllerRepresentable
的场景包装 UIPageViewController
,使用 UIViewController
s。我会从头开始实现这个而不是使用 Parchment - 它可能有点过分,也许某些方面可以设计得更好。
我可能遗漏了一些东西,但如果没有上下文中的进一步代码,很难提供帮助。此外,根据您的示例,在父视图中设置 PageView
更有意义,并且您在父视图控制器中的子视图不应捕获触摸(在 UIKit 或视图修饰符 .disabled(true)
中将 userInteractionEnabled
设置为 false在 SwiftUI 中)。这是如果 ParentView
覆盖在 ChildView
.
之上
我的父视图和子视图都有 ObservableObject:
import Parchment
class MainViewModel: ObservableObject {
@Published var inputText = String()
init() {}
}
struct ChildView: View {
@EnvironmentObject var viewModel: MainViewModel
var body: some View {
PageView(/**/) {
TextField("", $viewModel.inputText)
}
}
}
}
我尝试将 inputText 放入子视图的 ObservedObject 但没有任何变化。
当我输入一个字母时,键盘关闭。我认为 SwiftUI 开始重绘整个页面,因此 TextField 变得不活动。
如何解决这个问题?也许以某种方式强制激活 TextField,或者启动键盘?
您当前的代码无法在我的 Parchment
和 SwiftUI 的 2.4.0 版本上编译,因此我尝试推断各种细节 - 该代码在本机 SwiftUI 组件中运行良好。我会考虑重新构建代码,以便 @Published
属性 引用模型对象 - 这是更好的 SoC 并且可以更好地共享(鉴于你的 EnvironmentObject
我怀疑你正在通过此视图模型到多个视图)。
如@Asperi 所述,Parchment 并不理想。 PageView
包装了一个 UIViewController
作为分页控制器,每个页面都嵌套在另一个 UIHostingController
中!更好的方法是使 PagingController
为符合 UIViewControllerRepresentable
的场景包装 UIPageViewController
,使用 UIViewController
s。我会从头开始实现这个而不是使用 Parchment - 它可能有点过分,也许某些方面可以设计得更好。
我可能遗漏了一些东西,但如果没有上下文中的进一步代码,很难提供帮助。此外,根据您的示例,在父视图中设置 PageView
更有意义,并且您在父视图控制器中的子视图不应捕获触摸(在 UIKit 或视图修饰符 .disabled(true)
中将 userInteractionEnabled
设置为 false在 SwiftUI 中)。这是如果 ParentView
覆盖在 ChildView
.