簡體   English   中英

SwiftUI 無法添加 onChange 事件

[英]SwiftUI can not add onChange event

我有一個視圖,其中顯示了我的消息列表。 每當添加新消息時,我都想滾動到底部。 我正在嘗試向ForEach添加一個onChange事件,但這會以一些奇怪的錯誤破壞我的代碼:

在 'Array' 上引用實例方法 'onChange(of:perform:)' 要求 'Message' 符合 'Equatable'

而有時

編譯器無法在合理的時間內對該表達式進行類型檢查; 嘗試將表達式分解為不同的子表達式

當我刪除onChange時,一切都符合。

這是Message model:

struct Message: Identifiable {
    var id = UUID()
    var text: String
    var createdAt: Date = Date()
    var senderID: String
    var seen: Bool
    
    init(dictionary: [String: Any]) {
        self.text = dictionary["text"] as? String ?? ""
        self.senderID = dictionary["senderID"] as? String ?? ""
        self.seen = dictionary["seen"] as? Bool ?? false
    }
}

我在這里做錯了什么?

`對於每個

struct MessagesView: View {
    @ObservedObject var messagesViewModel: MessagesViewModel
    
    var body: some View {
        VStack {
            ScrollView(.vertical, showsIndicators: false, content: {
                ScrollViewReader { reader in
                    VStack(spacing: 20) {
                        ForEach(messagesViewModel.request.messages) { message in
                            Text(message.text)
                                .id(message.id)
                        }
                        .onChange(of: messagesViewModel.request.messages) { (value) in
                            reader.scrollTo(value.last?.id)
                        }
                    }
                }
            })
        }
    }
}

如果您的messages@Published ,則以下內容應該有效(正如我在Make a list scroll to bottom with SwiftUI 中測試的那樣)

struct MessagesView: View {
    @ObservedObject var messagesViewModel: MessagesViewModel
    
    var body: some View {
        VStack {
            ScrollView(.vertical, showsIndicators: false, content: {
                ScrollViewReader { reader in
                    VStack(spacing: 20) {
                        ForEach(messagesViewModel.request.messages) { message in
                            Text(message.text)
                                .id(message.id)
                        }
                        .onReceive(messagesViewModel.request.$messages) { (value) in
                           guard !value.isEmpty else { return } 
                           reader.scrollTo(value.last!.id)
                        }
                    }
                }
            })
        }
    }
}

備份

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM