Как я могу обновить данные внутри ячейки messageCollectionView swift?

#swift #collectionview #messagekit

#swift #collectionview #messagekit

Вопрос:

Я хотел бы показать загруженное изображение в ячейке. Я попытался сделать это таким образом:

 messages.filter { (mType) -> Bool in
                        mType.messageId == "(message.id)"
                    }.first?.kind = .photo(ImageMediaItem(image: UIImage(systemName: "photo")!.withTintColor(UIColor.gray, renderingMode: .automatic)))
  

где:

 var messages = [MessageType]()
  

но я увидел сообщение, в котором говорилось:

 Cannot assign to property: 'kind' is a get-only property
  

Поэтому я решил добавить сеттер / геттер к этому свойству:

 struct Message: MessageType {
    var sender: SenderType
    var messageId: String = ""
    var sentDate: Date
    var kind: MessageKind{
        get {
            return self.kind
        }
        set (newValue) {
            self.kind = newValue
        }
    }
}
  

Я использовал такую область для добавления данных в список чатов:

 messages.append(Message(sender: message.fromId == selectedContactID ? otherSender! : currentUser!, messageId: "(message.id ?? -1)", sentDate: Date().addingTimeInterval(-8600000), kind: mKind))
  

но после изменений, упомянутых выше, я увидел такое сообщение:

 Extra argument 'kind' in call
  

Я попытался просмотреть документацию, но мне не удалось найти что-то полезное для моей ситуации. Может быть, кто-нибудь знает, как решить эту проблему?

Ответ №1:

Вам нужно получить индекс объекта, который вам нужно изменить, с помощью struct

 if let index = messages.firstIndex(where:{ $0.messageId == "(message.id)" }) {
   messages[index].kind = .photo(ImageMediaItem(image: UIImage(systemName: "photo")!.withTintColor(UIColor.gray, renderingMode: .automatic)))
}
  

и для Extra argument 'kind' in call вычисляемого свойства не должно быть init в дополнение к этому в вашем случае вам не нужно создавать его computed property , поскольку вы реализуете то, что уже существует по умолчанию

Комментарии:

1. Итак, я не могу обновить определенную ячейку, в которой уже будет установлен вид внутри моего collectionview?

2. и ваша область кода выдает мне ошибку Cannot convert value of type 'MessageType' to expected argument type 'Int'

3. добавьте индекс объекта вместо самого объекта в качестве свойства внутри ячейки КСТАТИ, вы также можете делегировать все vc для доступа к массиву

4. Я все еще чего-то не понимаю, я должен изменить свою структуру сообщения? потому что после вставки вашего ответа я получил сообщение о свойстве get only: (

5. измените его на var kind: MessageKind или var kind: MessageKind? , если вам нужно отложить инициализацию