首页 > 解决方案 > 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。

标签: swiftui

解决方案


推荐阅读