gpt4 book ai didi

ios - SwiftUI - 在导航堆栈中弹回不会释放 View

转载 作者:行者123 更新时间:2023-12-01 16:12:27 26 4
gpt4 key购买 nike

我想首先突出显示我的 View 层次结构。我只有 FindUserViewWelcomeView .
FindUserView如果输入的电子邮件存在,则用于从服务器检索用户。如果是这样,那么它会自动将我重定向到下一个 WelcomeView我可以在这里输入密码并登录。

我创建了一个 repo here和视频 SwiftUI - Pop back does not deallocate view

我的 FindUserView :---------------------------- 和 WelcomeView :

enter image description here ----------------- enter image description here

FindUserView 上的 NEXT 按钮我从数据库中获取用户:

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
}
}
}

我用 NavigationView并以编程方式显示 WelcomeView通过更改 showWelcomeView上面的状态:
NavigationLink(destination: WelcomeView(), isActive: $showWelcomeView) { EmptyView() }

现在我在欢迎 View WelcomeView .

但是当我按下这个按钮并弹回时,我的 WelcomeView仍然存在。

enter image description here

当我使用时 @EnvironmentObject使用可观察的属性状态,我看到它如何反射(reflect)到已经被驳回的 View 中。这是正确的行为吗?或者我需要解除分配 WelcomeView不知何故?它会导致内存泄漏吗?

我有点担心 UIKit当您在导航堆栈中弹回 View Controller 时,它会被 UINavigationController 释放。通过自动从数组中删除 View Controller 。如何在 SwiftUI 中正确弹出?

最佳答案

实际上不清楚它是否有缺陷 - SwiftUI View 是值,因此它们没有释放的东西。它看起来像 NavigationView只保留诸如 lastView 变量之类的东西,直到它被另一个变量替换。也许值得向 Apple 提交反馈。

同时,这里有一个解决方案,它允许将实际目标 View 的创建推迟到恰好 NavigationLink当 View 通过后退按钮从堆栈中移除时,点击并清理它(使用任何相关资源,如 View 模型)。

使用 Xcode 11.4/iOS 13.4 测试

助手代理 View 演示者:

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 }
}
}

用法:
NavigationLink(destination: LinkPresenter { WelcomeView() }, 
isActive: $showWelcomeView) { EmptyView() }

关于ios - SwiftUI - 在导航堆栈中弹回不会释放 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61448125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com