Mat*_*der 7 ios swift swiftui ios-navigationview
我想首先突出显示我的视图层次结构。我只有FindUserView
和WelcomeView
。
FindUserView
如果输入的电子邮件存在,则用于从服务器检索用户。如果是这样,那么它会自动将我重定向到下一个WelcomeView
可以输入密码并登录的位置。
我在这里创建了一个存储库和一个视频SwiftUI - Pop back does not dealate view
我的FindUserView
:---------------------------------------- 和WelcomeView
:
通过按 NEXT 按钮,FindUserView
我从数据库中获取用户:
func fetchUser(with email: String) {
userService.getUser(with: email) { (result) in
switch result {
case .success(_):
self.showActivityIndicator = false
self.showingAlert = false
self.showWelcomeView = true
break
case .failure:
self.showingAlert = true
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
我通过更改上面的状态来使用NavigationView
并以编程方式显示:WelcomeView
showWelcomeView
NavigationLink(destination: WelcomeView(), isActive: $showWelcomeView) { EmptyView() }
Run Code Online (Sandbox Code Playgroud)
现在我处于欢迎观点WelcomeView
。
但是当我按下这个按钮并弹出时,我的WelcomeView
仍然存在。
当我@EnvironmentObject
与可观察的属性状态一起使用时,我看到它如何反映到已经被忽略的视图中。这是正确的行为吗?或者我需要以WelcomeView
某种方式解除分配?会导致内存泄漏吗?
我有点担心,因为UIKit
当您在导航堆栈中弹出视图控制器时,它会UINavigationController
通过自动从数组中删除视图控制器来解除分配。如何在 SwiftUI 中正确弹出?
实际上并不清楚它是否有缺陷 - SwiftUI 视图是值,因此它们没有解除分配的东西。它看起来只是保留了类似lastViewNavigationView
变量的东西,直到它被另一个变量替换为止。也许值得向苹果提交反馈。
同时,这里的解决方案允许推迟真正的目标视图创建,直到NavigationLink
通过“后退”按钮从堆栈中删除视图时精确点击并清理它(使用任何相关资源,例如视图模型)。
使用 Xcode 11.4 / iOS 13.4 进行测试
帮助代理查看演示者:
struct LinkPresenter<Content: View>: View {
let content: () -> Content
@State private var invlidated = false
init(@ViewBuilder _ content: @escaping () -> Content) {
self.content = content
}
var body: some View {
Group {
if self.invlidated {
EmptyView()
} else {
content()
}
}
.onDisappear { self.invlidated = true }
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
NavigationLink(destination: LinkPresenter { WelcomeView() },
isActive: $showWelcomeView) { EmptyView() }
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2690 次 |
最近记录: |