对于父视图和子视图,我都有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或启动键盘?
答案 0 :(得分:1)
您当前的代码无法在我的newlst
的2.4.0版本和SwiftUI上编译,因此我尝试推断各种细节-该代码在本机SwiftUI组件中可以正常工作。我会考虑重新构建代码,以便Parchment
属性引用一个Model对象-这是更好的SoC,可以更好地共享(鉴于您的@Published
我怀疑您正在将此视图模型传递给多个视图)。
如@Asperi所述,羊皮纸并不理想。 EnvironmentObject
包装了一个PageView
作为分页控制器,并且每个页面都嵌套在另一个UIViewController
中!更好的方法是使用UIHostingController
将PagingController
封装为UIPageViewController
的场景包装为UIViewControllerRepresentable
。与使用羊皮纸相比,我只是从头开始实现这一点-这可能是过大的,也许某些方面可以设计得更好。
我可能会缺少一些东西,但是如果没有上下文的进一步代码,很难提供帮助。同样,从您的示例中,在父视图中设置UIViewController
更有意义,并且父视图控制器中的子视图不应捕获触摸(在UIKit或View修饰符PageView
中将userInteractionEnabled
设置为false在SwiftUI中)。如果.disabled(true)
被覆盖在ParentView
的顶部。