swiftui - View 的 init 在 tabview SwiftUI 中只被调用一次
问题描述
我正在制作一个应用程序,我正在为当前用户更新 profileView 选项卡中的个人资料图片。然后我导航到 feedView 选项卡,我希望在与当前用户相关的每个帖子中更改个人资料图片。但是在 feedview 个人资料图片中没有更新。如果我重新运行该应用程序,我会正确看到提要视图中的更改。
所以我调试了应用程序,发现只有第一次调用 tabview 内的 FeedCellview 的 init() 。当我使用该应用程序并导航到 Feedview 时,没有调用 init,因此我无法从 viewmodel 更新数据。
主视图:
var body: some View {
TabView (selection: $tabSelection){
NavigationView{
FeedView()
.navigationTitle("Feed")
.navigationBarItems(trailing: logoutButton)
}
.tabItem {
Image(systemName: "house")
}.tag(1)
...................
...................
饲料视图:
import SwiftUI
struct FeedView: View {
@StateObject private var feedViewModel = FeedViewModel()
var body: some View {
ScrollView(){
LazyVStack(spacing:32){
ForEach(feedViewModel.posts){post in
FeedCellView(viewModel: FeedCellViewModel(post: post))
}
}
}
}
}
饲料细胞视图:
struct FeedCellView: View {
@ObservedObject var feedCellViewModel:FeedCellViewModel
init(viewModel:FeedCellViewModel){
self.feedCellViewModel = viewModel //This init is not being called after first time
print("feed Cell View Init")
}
var body: some View {
VStack(alignment:.leading){
if let user = feedCellViewModel.post.user{
NavigationLink(
destination: ProfileView(user: user),
label: {
HStack{
if let imageUrl = feedCellViewModel.post.ownerImageUrl{
KFImage(URL(string: imageUrl))
.resizable()
.scaledToFill()
.frame(width:36,height: 36)
.clipped()
.cornerRadius(18)
}else{
Image("profile-placeholder")
.resizable()
.scaledToFill()
.frame(width:36,height: 36)
.clipped()
.cornerRadius(18)
}
................
................
FeedCellViewModel:
class FeedCellViewModel:ObservableObject{
@Published var post:PostModel
init(post:PostModel){
self.post = post
fetchUser()
checkLike()
}
func fetchUser(){
print("Feed cell ViewModel fetchUser called")
Firestore.firestore().collection("users").document(post.ownerId).getDocument { (snap, error) in
if let error = error{
print(error.localizedDescription)
return
}
DispatchQueue.main.async {
self.post.user = try? snap?.data(as: UserModel.self)
guard let userImageUrl = self.post.user?.profileImageUrl else{return}
self.post.ownerImageUrl = userImageUrl
print("OwnerImageUrl \(self.post.ownerUsername): \(self.post.ownerImageUrl ?? "No Image Url")")
}
}
}
............................
............................
为什么init()
在 FeedCellVIew 中只调用一次?我正在使用 Xcode 12.2。
解决方案
推荐阅读
- python - 使用 arcpy 进行缓冲区分析
- python - 如何将字符串转换为张量流模型?
- nginx - Websocket 从连接到关闭
- pytorch - pytorch多机训练超时?
- algorithm - 容器中 X n 搜索的性能问题
- react-native - Android 11 上的展览位置权限处理问题
- python - 无法在 AWS 虚拟机上运行使用 Pyinstaller 创建的 .exe 文件
- verilog - EDAPlayground:Verilog 代码“达到最大运行时间”
- java - 如何使用 Mockito Junit 5 为 lambda 表达式创建 Junit 测试用例?
- macos - 使用 Qt 获取当前的 macOS shell