0

我的父视图和子视图有 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 或启动键盘?

4

1 回答 1

1

您当前的代码无法在我的 2.4.0 版本Parchment和 SwiftUI 上编译,因此我尝试推断各种细节 - 该代码在本机 SwiftUI 组件中运行良好。我会考虑重新构建代码,以便@Published属性引用模型对象 - 这是更好的 SoC 并且允许更好地共享(假设你EnvironmentObject我怀疑你正在将此视图模型传递给多个视图)。

正如@Asperi 所提到的,羊皮纸并不理想。PageView将 a 包装UIViewController为分页控制器,并且每个页面都嵌套在另一个UIHostingController! 更好的方法是为符合, 和s的场景进行PagingController包装。我会从头开始实现这个,而不是使用 Parchment - 这可能有点矫枉过正,也许某些方面可以设计得更好。UIPageViewControllerUIViewControllerRepresentableUIViewController

我可能遗漏了一些东西,但是如果没有上下文中的进一步代码,就很难提供帮助。此外,从您的示例中,PageView在父视图中进行设置更有意义,并且父视图控制器中的子视图不应捕获触摸(userInteractionEnabled在 UIKit 中设置为 false 或.disabled(true)在 SwiftUI 中设置为 View 修饰符)。这是如果ParentView覆盖在ChildView.

于 2020-06-08T13:52:34.840 回答