父视图和子视图有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开始重绘整个页面,并且因为这个文本字段变得不活动。
怎么解决这个问题? 也许以某种方式强制激活文本字段,或者启动键盘?
您当前的代码没有在我的parchment
2.4.0版本和SwiftUI上编译,因此我尝试推断各种细节--该代码在本机SwiftUI组件中运行良好。 不过,我会考虑重新设计代码架构,以便@published
属性引用一个模型对象--这是更好的SoC,允许更好地共享(鉴于您的EnvironmentObject
,我怀疑您正在将此视图模型传递给多个视图)。
羊皮纸并不像@Asperi所说的那样理想。 PageView
包装一个UIViewController
作为分页控制器,每个页面都嵌套在另一个UIHostingController
中! 更好的方法是使PagingController
成为符合UIViewControllerRepresentable
的场景的包装的UIPageViewController
,并使用UIViewController
。 我只是从头开始实现这一点,而不是使用羊皮纸--这可能是过度的,也许某些方面可以设计得更好。
我可能漏掉了一些东西,但是如果没有上下文中的进一步代码,就很难帮上忙。 另外,从您的示例来看,在父视图中设置PageView
更有意义,并且您在父视图控制器中的子视图不应捕获触摸(在UIKit中将UserInteractionEnabled
设置为false,或者在SwiftUI中将视图修饰符.Disabled(true)
)。 如果parentview
覆盖在childview
之上,则会出现这种情况。