如何解决如何从onContinueUserActivity更改WindowGroup视图?
我有一个深层链接的应用程序,因此首先我呈现了加载或主视图:
@main
struct AppMain: App {
var body: some Scene {
WindowGroup {
LoadingView()
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb,perform: handleUserActivity)
}
}
}
但是,在响应活动的handleUserActivity
中,如何根据活动参数更新屏幕?例如,我提取了一个值,并希望从此处渲染视图:
private extension AppMain {
func handleUserActivity(_ userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL,let components = NSURLComponents(url: url,resolvingAgainstBaseURL: true),let queryItems = components.queryItems
else {
return
}
if let modelID = queryItems.first(where: { $0.name == "id" })?.value {
SmoothieView(id: modelID) // TODO: How to I render view??
}
}
}
如何替换LoadingView
并显示SmoothieView
?
解决方法
这是一种可能的方法-在顶部视图中使用应用程序状态对象和观察者根据状态进行切换。
(注意:代码是在适当的地方键入的,因此可能是拼写错误)
class AppState: ObservableObject {
@Published var modelID: String?
}
@main
struct AppMain: App {
@StateObject var appState = AppState()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(appState)
.onContinueUserActivity(NSUserActivityTypeBrowsingWeb,perform: handleUserActivity)
}
}
}
private extension AppMain {
func handleUserActivity(_ userActivity: NSUserActivity) {
guard let url = userActivity.webpageURL,let components = NSURLComponents(url: url,resolvingAgainstBaseURL: true),let queryItems = components.queryItems
else {
return
}
if let modelID = queryItems.first(where: { $0.name == "id" })?.value {
self.appState.modelID = modelID // << here !!
}
}
}
// as soon as you receive model id the view will be refreshed
struct ContentView: View {
@EnvironmentObject var appState: AppState
var body: some View {
if appState.modelID == nil {
LoadingView()
} else {
SmoothieView(id: appState.modelID!)
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。