我有以下观点。
struct ContentView: View {
@State var data = "Intitial Value"
var body: some View {
VStack {
Text(data)
Button(action: { self.data="Changed value" }) {
Text("Click Here")
}
}
}
}这段简单的代码运行良好,每当我单击按钮时,它反映在屏幕标签上的数据属性。
现在,我想在收到URL时更改文本标签,但以下代码不起作用。
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let vc = self.window?.rootViewController as? UIHostingController<ContentView> else {
return
}
vc.rootView.data = "Scene Delegate"
}发布于 2020-04-04 12:33:59
您可以使用通过EnvironmentObject注入的模型视图来实现这一点
class DataViewModel: ObservableObject {
@Published var data = "Intitial Value"
}
struct ContentView: View {
@EnvironmentObject var vm: DataViewModel // < declare
var body: some View {
VStack {
Text(vm.data) // < use
Button(action: {
self.vm.data="Changed value" // < use
}) {
Text("Click Here")
}
}
}
}在SceneDelegate中,将此作为成员
class SceneDelegate {
var dataVM = DataViewModel() // << create
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
...
let contentView = ContentView()
.environmentObject(dataVM) // << inject
window?.rootViewController = UIHostingController(rootView: contentView)
...
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
dataVM.data = "Scene Delegate" // << modify
}
...https://stackoverflow.com/questions/61020818
复制相似问题