Swift tableView Клетки исчезают при прокрутке - PullRequest
0 голосов
/ 03 ноября 2018

Попытка добавить функцию чата в мое приложение с tableView, но когда я прокручиваю свои чаты, некоторые ячейки исчезают, и я не уверен, почему. Любая помощь приветствуется.

TableView подключен к источнику данных и делегирован в раскадровке.

Я создал саму ячейку в xib-файле и, в зависимости от того, будет ли это сообщение отправителя или полученное сообщение, будет отображаться по-разному. Это код для каждой ячейки:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "customMessageCell", for: indexPath) as! CustomMessageCell

    //Sets cell to message

    senderId = messageArray[indexPath.row].fromId

    if senderId == Auth.auth().currentUser?.uid as String? {
        //Messages We Sent 
        cell.ourMessageBody.text = messageArray[indexPath.row].messageBody

        cell.ourMessageBackground.backgroundColor = UIColor(displayP3Red: 59/255.0, green: 89/255.0, blue: 152/255.0, alpha: 1)
        cell.ourMessageBody.textColor = UIColor.white

        cell.avatarImageView.isHidden = true
        cell.messageBackground.isHidden = true

    } else{
        //Messages someone else sent
        cell.messageBody.text = messageArray[indexPath.row].messageBody
        cell.avatarImageView.backgroundColor = UIColor(white: 0.95, alpha: 1)
        cell.messageBackground.backgroundColor = UIColor(white: 0.95, alpha: 1)
        cell.ourMessageBackground.isHidden = true
        //toId ProfileImage
        if let imageID = toId{
            print(imageID)
            let imagesStorageRef = Storage.storage().reference().child("profilepic/").child(imageID)
            imagesStorageRef.getData(maxSize: 1*1024*1024, completion: { (data, error) in
                if error != nil{
                    print(error)
                    return
                }
                DispatchQueue.main.async {
                    cell.avatarImageView?.image = UIImage(data: data!)
                }

            })

        }
    }

    return cell
}

А вот способ получения сообщений:

    func retrieveMessages() {

    let testUserOrAd = SwipingView.myAdvertiserVar.advertiser
    print("testing result: \(testUserOrAd) your are a User")

    //if advertiser
    if testUserOrAd == true{
        if let testId = self.toId{
            let MessageDB = Database.database().reference().child("Users").child(toId!).child("Messages").child(uid!)

            MessageDB.observe(.childAdded) { (snapshot) in
                let snapshotValue =  snapshot.value as! Dictionary<String,String>

                let text = snapshotValue["MessageBody"]!
                let fromId = snapshotValue["FromId"]

                let message = Message()
                message.messageBody = text
                message.fromId = fromId

                self.messageArray.append(message)

                self.configureTableView()
                self.messageTableView.reloadData()
            }
        }

    }else{
        //if user

        let MessageDB = Database.database().reference().child("Users").child(uid!).child("Messages").child(toId!)

        MessageDB.observe(.childAdded) { (snapshot) in
            let snapshotValue =  snapshot.value as? [String: AnyObject]

            let text = snapshotValue!["MessageBody"] as? String
            let fromId = snapshotValue!["FromId"] as? String

            let message = Message()
            message.messageBody = text
            message.fromId = fromId

            self.messageArray.append(message)

            self.configureTableView()
            self.messageTableView.reloadData()
        }

    }
}

И вот результат:

enter image description here

1 Ответ

0 голосов
/ 06 ноября 2018

Ваш код неверен, потому что вы настраиваете свои ячейки один раз (в методе tableView:cellForRowAt:), но когда вы прокручиваете представление таблицы, если пользователь чередуется, avatarImageView, messageBackground и ourMessageBackground будут скрыты в конце концов.

Попробуйте обновить свой код так:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = tableView.dequeueReusableCell(withIdentifier: "customMessageCell", for: indexPath)

  cell.ourMessageBackground.backgroundColor = UIColor(displayP3Red: 59/255.0, green: 89/255.0, blue: 152/255.0, alpha: 1)
  cell.ourMessageBody.textColor = UIColor.white
  cell.avatarImageView.backgroundColor = UIColor(white: 0.95, alpha: 1)
  cell.messageBackground.backgroundColor = UIColor(white: 0.95, alpha: 1)

  self.tableView(tableView, willDisplay: cell, forRowAt: indexPath)

  return cell
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
  guard let cell = cell as? CustomMessageCell else { return }

  //Sets cell to message

  let senderId = messageArray[indexPath.row].fromId

  if senderId == Auth.auth().currentUser?.uid as String? {
    //Messages We Sent
    cell.ourMessageBody.text = messageArray[indexPath.row].messageBody

    cell.avatarImageView.isHidden = true
    cell.messageBackground.isHidden = true
    cell.ourMessageBackground.isHidden = false
  } else {
    //Messages someone else sent
    cell.messageBody.text = messageArray[indexPath.row].messageBody

    cell.avatarImageView.isHidden = false
    cell.messageBackground.isHidden = false
    cell.ourMessageBackground.isHidden = true

    //toId ProfileImage
    if let imageID = toId {
      let imagesStorageRef = Storage.storage().reference().child("profilepic/").child(imageID)
      imagesStorageRef.getData(maxSize: 1*1024*1024, completion: { (data, error) in
        if error != nil{
          print(error)
          return
        }

        DispatchQueue.main.async {
          guard let c = tableView.cellForRow(at: indexPath) else { return }

          c.avatarImageView?.image = UIImage(data: data!)
        }

      })

    }
  }
}

Кроме того, поскольку выборка аватара выполняется в фоновом режиме, при извлечении данных ячейка могла измениться. Таким образом, вы должны быть уверены, что ячейка все еще отображается. И вы должны кэшировать аватар, чтобы не получать его каждый раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...