【问题标题】:SwiftUI - Passing post.id to a ViewModelSwiftUI - 将 post.id 传递给 ViewModel
【发布时间】:2021-09-19 11:32:36
【问题描述】:

我正在尝试添加一个 cmets 功能,显然每个帖子都有自己的一组 cmets。为此,我试图将 post.id(来自 PostRow.swift)传递给我的 CommentsViewModel 中的一个函数。但是,由于没有直接调用该函数,我不确定如何执行此操作。例如,在我的其他一些函数中,我所要做的就是将 (id: post.id) 添加到参数:postData.checkForLikes(id: post.id)。然后,在实际功能中,我所要做的就是func checkForLikes(id: String)

就像我说的,没有什么是直接调用这个函数getComments。代码如下:

PostRow.swift - 显示 cmets 的按钮

                    showingComments = true
                    //unsure if an action to update postID should be here?
                }){
                    Text("Comments")
                }
                .transition(.move(edge: .leading))
                .sheet(isPresented: self.$showingComments)
                {
                    CommentsView(post: post)
                }

CommentsView.swift - 查看

@StateObject var commentsData = CommentsViewModel()
ScrollView{
                    VStack(spacing: 15){
                        
                        ForEach(commentsData.comments){comment in
                            
                            CommentsRow(post: post, comment: comment, commentData: commentsData)
                            
                        }
                    }
                    .padding()
                    .padding(.bottom,55)
                }
            }

CommentsRow.swift - 每条评论的实际格式,仅包括 CommentsRow 引用的知识

struct CommentsRow: View {
    
    var post : PostModel
    var comment : CommentsModel
    @ObservedObject var commentData : CommentsViewModel
    let uid = Auth.auth().currentUser!.uid
    
    var body: some View {
}

CommentsViewModel.swift

class CommentsViewModel : ObservableObject{
    
    @Published var comments : [CommentsModel] = []
    @Published var noComments = false
    @Published var newComment = false
    @Published var commentTxt = ""

    
    let ref = Firestore.firestore()
    let uid = Auth.auth().currentUser!.uid
    
    var post: PostModel?
    init(post: PostModel? = nil) {
            if let post = post {
                self.post = post
            }
        getComments(id: "") //need to pass post.id to this view?
        }
    
    func getComments(id: String) {
//code for this function. All I need to really do right now is print the post.id
}

这应该是理解这个问题所需的所有代码。我确信这是一个简单的解决方法,但我已经尝试了四天,但没有运气。

编辑:我选择的答案有效,但是我的 cmets 不再显示,因为 getComments 未初始化。有这个问题的帖子是here

【问题讨论】:

    标签: ios xcode firebase swiftui


    【解决方案1】:

    首先,您可能想要修改您的 CommentsViewModel 并删除其 init 初始化程序并将 didSet 添加到 post 属性:

    class CommentsViewModel : ObservableObject{
        
        @Published var comments : [CommentsModel] = []
        @Published var noComments = false
        @Published var newComment = false
        @Published var commentTxt = ""
    
        
        let ref = Firestore.firestore()
        let uid = Auth.auth().currentUser!.uid
        
        var post: PostModel? {
            didSet {
                if let post = post {
                    getComments(id: post.id)
                }
            }
        }
        
        func getComments(id: String) {
            //get comments
        }
    }
    

    在您的 CommentsView 中,添加以下内容:

    ScrollView {
      //existing code
    }.onAppear {
      commentsData.post = post
    }
    

    这将触发视图模型中的didSet,它将调用getComments

    【讨论】:

    • 我建议不要像 Auth.auth().currentUser!.uid 这样强制解开当前用户 - 相反,注册一个身份验证状态处理程序(例如在身份验证服务中),使用户成为一个 @Published 属性,然后使用组合来收听任何变化。有关如何执行此操作的示例,请参阅 github.com/peterfriese/BookShelf/blob/main/code/frontend/apple/…
    • @PeterFriese 好建议。我没有专注于此,因为它与问题无关,但我认为这是一个很好的观点。
    • 删除初始化只是展示了我的加载轮。初始化 getComments 是一项要求,无需完全重新执行此代码。我尝试在 if let post = post 之后添加 init ,但这会引发错误。我相信我需要在参数中使用 id: post.id 初始化 getComments。
    • 有什么可能的方法我仍然可以用这段代码初始化 getComments 吗?我的代码需要初始化才能工作
    • init 中包含getComments 本身并没有什么特别之处。我看过你关于这个的其他帖子,并就你删除的那个问了几个问题。您是否使用调试器来确保 getComments 被调用?您指的是加载轮,但您从未在任何问题中显示该代码,因此不清楚它指的是什么或它依赖于什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2012-05-13
    • 2014-03-23
    相关资源
    最近更新 更多