更新数据源后未重新加载 Rx 表视图

Posted

技术标签:

【中文标题】更新数据源后未重新加载 Rx 表视图【英文标题】:Rx table view not being reloaded after the datasource gets updated 【发布时间】:2017-11-10 09:35:23 【问题描述】:

我有一个表格视图,我正在尝试使其反应。我使用 Swift 让它工作。

以下是 RxSwift 代码

viewModel.getDetailMessages().asObservable().bind(to: messageTableView.rx.items) tableView, row, element in
            let indexPath = IndexPath(row: row, section: 0)
            print("The size is", InboxData.sharedInstance.inboxdata[messageIndexPath.row].messageDetail.count)
            print("The size is element", element)
            if !element.isSender
                let cell = tableView.dequeueReusableCell(withIdentifier: "recieverCell", for: indexPath) as! RecieverMessageTableViewCell
                cell.message.text = element.messageText
                cell.message.preferredMaxLayoutWidth = 287
                cell.message.layer.cornerRadius = 8
                cell.message.layer.masksToBounds = true
                return cell
            else
                let cell = tableView.dequeueReusableCell(withIdentifier: "senderCell", for: indexPath) as! SenderMessageTableViewCell
                cell.senderMessage.text = element.messageText
                cell.senderMessage.layer.cornerRadius = 8
                cell.senderMessage.preferredMaxLayoutWidth = 287
                cell.senderMessage.layer.masksToBounds = true
                return cell
            
        

以下是我的视图模型

class MessagwViewModel

    func getDetailMessages() -> Observable<[Message]> 
        return Observable.just(InboxData.sharedInstance.inboxdata[messageIndexPath.row].messageDetail)
    


这是消息数据类

class MessageData 

    static let sharedInstance = MessageData()

    var message1 = Message(profilePicture: "Taylor Ward", artistName: "Taylor Ward", messageText: "Hi How are you?", isSender: true)

    var messages = [Message]()

    private init() 
        loadMessages()
    

    func loadMessages() 
        messages.removeAll()
        messages.append(message1)

    


单击按钮时,我正在尝试将数据附加到消息数组中,如下所示

sendButton.rx.tap.bind value in
            InboxData.sharedInstance.inboxdata[messageIndexPath.row].messageDetail.append(Message(profilePicture: "", artistName: "", messageText: self.messageTextView.text, isSender: true))

       self.messageTableView.reloadData()
            self.messageTableView?.scrollToBottom()
            print("Button clicked")
        

每次添加新元素时,数组的计数都会增加。但是即使数据源具有最新值,表格视图也不会重新加载

谁能指出问题出在哪里?谢谢。

【问题讨论】:

【参考方案1】:

您的问题出在MessagwViewModel。 Observable.just 只流出一个元素然后完成。它不监视对象的更改。这个最简单的修复(即hack)是使messageDetail成为Variable。您没有显示该变量是如何定义的,但根据它的调用方式,我假设它目前是这样的:var messageDetail: [Message]。将其更改为let messageDetail: Variable&lt;[Message]&gt;。使用 messageDetail.value = ... 分配给它,并通过其 Observable messageDetail.asObservable() 读取它

【讨论】:

变量已被弃用,请改用 BehaviorRelay。 最好还是避免使用变量或行为中继。

以上是关于更新数据源后未重新加载 Rx 表视图的主要内容,如果未能解决你的问题,请参考以下文章

在 reloadData 后未调用 cellForRowAtIndexPath

iOS 在更新后从 Web 服务重新加载数据

React Native:更新数据后未重新渲染组件

pkg_resources.get_distribution("mymodule").version 重新加载后未更新

重新加载 UITableView 数据而不重新加载视图?

更新 viewpager 内的 Fragment 视图而不重新加载数据