Представление таблицы Rx не перезагружается после обновления источника данных
У меня есть табличное представление, которое я пытаюсь сделать реактивным. У меня это работает с использованием 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 только выводит один элемент, а затем завершает. Он не контролирует объект на предмет изменений. Это самое простое решение (т.е. взломать), чтобы сделать messageDetail
Variable
, Вы не показываете, как определяется эта переменная, но исходя из того, как она вызывается, я предполагаю, что она в настоящее время выглядит так: var messageDetail: [Message]
, Измените это на let messageDetail: Variable<[Message]>
, Присвойте ему, используя messageDetail.value = ...
и читать из него через его наблюдаемый messageDetail.asObservable()