首页 > 解决方案 > UITableViewCell 没有正确着色

问题描述

我有一个UITableViewCell包含 2 个header部分的自定义项(一个用于Moderators,一个用于Members)。

这是一个聊天应用程序,所以在我从数据库中获取聊天成员及其相应状态(即成员或主持人)后,我将它们存储在一个数组中并根据该数据填充我的单元格。

当我想contentView.backgroundColor在当前登录的用户与user.id传递给单元格的匹配时更新单元格时,问题就出现了。

我知道成员(全部)只有 3 个,但是当我从单元格中打印 theuserId和 thecurrentUserId时,我看到它被调用了 4 次,这很奇怪。

  class ChatMembers: UIViewController { 
     var chatMembers = [
                    [UserModel](),
                    [UserModel]()
                  ]
     var participantsStatus = [String:String]()
     var chatId = ""


    override func viewDidLoad() {
       super.viewDidLoad()
       observeMemberStatus()
    }

func observeMemberStatus() {
    if chatId != "" {
        Api.Message.observeChatRoomMemberStatus(forChatId: chatId, completion: { memberAndStatus in
            self.participantsStatus = memberAndStatus

            for member in memberAndStatus {
                if member.value == "moderator" {
                    Api.Users.observeUsersShort(withId: member.key, completion: { user in
                        self.chatMembers[0].append(user)
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    })
                }
                else {
                    Api.Users.observeUsersShort(withId: member.key, completion: { user in
                        self.chatMembers[1].append(user)
                        DispatchQueue.main.async {
                            self.tableView.reloadData()
                        }
                    })
                }
            }
        })
    }
}

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ChatParticipantSettingsTVC") as! ChatParticipantSettingsTVC
    let user = chatMembers[indexPath.section][indexPath.row]
    cell.user = user
    cell.delegateChatParticipantsProtocol = self
    return cell
}

和细胞本身:

 var user: UserModel? {
    didSet {
        updateView()
    }
}

func updateView() {
    guard let currentUserId = Api.Users.CURRENT_USER?.uid else { return }
    guard let userId = user?.id else { return }

      print("userId: ", userId)
      print("currentUserId: ", currentUserId)
      // 
    if userId == currentUserId {
        contentView.backgroundColor = UIColor.hex("F0F4F6")
    }
}

上面的 2 个打印语句打印以下内容:

userId:ZgoQHyzAoPOS3amv
currentUserId:T3kOyOWvl6aZhDY
userId:FtvyJ7FshZQuGpLR08
currentUserId:T3kOyOWvl6aZhDY
userId:ZgoQHyzAoPOS3amv
currentUserId:T3kOyOWvl6aZhDY
userId:T3kOyOWvl6aZhDY
currentUserId:T3kOyOWvl6

它基本上第二次打印出一个用户,我不知道为什么。(随机用户,有时是当前用户,这会影响单元格的着色方式,有时是不同的用户,因为数组没有被排序)

标签: arraysswiftuitableview

解决方案


您需要添加 else 条件:

if userId == currentUserId {
    contentView.backgroundColor = UIColor.hex("F0F4F6")
}

因为一旦更改了背景颜色,它将如何恢复。

添加其他条件:

if userId == currentUserId {
    contentView.backgroundColor = UIColor.hex("F0F4F6")
}
else {
    contentView.backgroundColor = "Default color"
}

或者您可以添加cellForRowAt

cell.contentView.backgroundColor = "Default color"

推荐阅读