Как вернуть ноль для UITableViewCell - PullRequest
0 голосов
/ 24 сентября 2018

Я создаю приложение для чата, в котором в моем приложении есть ограничения на показ сообщений.Если пользователь не является подписчиком, он увидит только 3 сообщения в uitableview.Я хочу показать только 3 сообщения пользователю и неограниченное количество отправителей.В моем табличном представлении есть 2 ячейки, одна для отправителя и вторая для получателя.Это мои условия.

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

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            print(indexPath.section)

        if indexPath.section == 0
        {
            let model = senderMessageArray[indexPath.row]
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! CellTwo
                if (model.sender_id == AppData.user_id()!)
                {
                  //SENDER
                    cell.backgroundColor = UIColor.clear
                    let lbl_send = cell.viewWithTag(11) as! UILabel
                    let lbl_date = cell.viewWithTag(12) as! UILabel
                    lbl_send.text = AppData.base64Decode(base64: model.message!)
                    lbl_date.text = AppData.TimeDateFormat(date: model.datetime!)

                }
             return cell
        }
        if indexPath.section == 1
         {
           //RECEIVER

            let  cellTwo =  tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ConversationTableViewCell
                let model = receiveMessageArray[indexPath.row]

                    cellTwo.backgroundColor = UIColor.clear
                   let lbl_send =
                    cellTwo.viewWithTag(22) as! UILabel
                    let lbl_date = cellTwo.viewWithTag(23) as! UILabel
                    lbl_send.text = AppData.base64Decode(base64: model.message!)
                    lbl_date.text = AppData.TimeDateFormat(date: model.datetime!)


            return cellTwo
        }
        else
        {
            return UITableViewCell()
        }

    }



func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        print("sections: \(section)")
        print("receive Messages Count : \(receiveMessageArray.count)")
        print("senderMessageArray Messages Count : \(senderMessageArray.count)")
        print("Total Messages Count : \(conversationChatMessages.count)")
        if section == 0
        {
            return senderMessageArray.count
        }
        else{

            return receiveMessageArray.count

        }

    }

Добавление массива в соответствии с лимитом

conversationChatMessages = Mapper<Chats>().mapArray(JSONObject: chatObject)!

                for receiveSms in conversationChatMessages
                {
                    if receiveSms.sender_id !=  AppData.user_id()!
                    {

                        if (conversationData?.daysleft == 0)
                        {
                            if (todayLimit < 4)
                            {
                                self.receiveMessageArray.append(receiveSms)

                                todayLimit += 1
                            }

                        }
                    }
                    else
                    {
                            self.senderMessageArray.append(receiveSms)

                    }

проблема в том, что я получаю всех отправителейсначала сообщения, а затем сообщения получателя не в последовательности

enter image description here

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Предыдущие ответы верны, но, возможно, это поможет передать смысл.

Определить модель

struct ConversationViewModel {

    private var chatMessages = [ChatMessage]()

    func rowsInChat() -> Int{
        return chatMessages.count
    }

    func messageFor(_ indexPath: IndexPath) -> ChatMessage{
        return chatMessages[indexPath.row]
    }

    func setChat(_ chatMessages: [ChatMessages] {

       var finalMessages = chatMessages.filter{ $0.senderId == viewer }
       var notMyMessages = chatMessages.filter{ $0.senderId != viewer}.sorted(by: {$0.date < $1.date } )

       var limit = notMyMessagescount > accountLimit ? accountLimit : notMyMessagescount

       finalMessages.append( notMyMessages[0..<limit] ).sorted(by: {$0.date < $1.date } ) 
       chatMessages = finalMessages

       //should probably notify VC that data changed
   }

}

struct ChatMessage {

    let senderId : String
    let message : String
    let date : Date
}

заполнить модель

 let messages = [
            ChatMessage.init(senderId: "1", message: "hi", date: Date()),
            ChatMessage.init(senderId: "2", message: "yo", date: Date().addingTimeInterval(1.0)),
            ChatMessage.init(senderId: "1", message: "you code bro?", date: Date().addingTimeInterval(2.0)),
            ChatMessage.init(senderId: "2", message: "fo sho", date: Date().addingTimeInterval(3.0)),
            ChatMessage.init(senderId: "1", message: "let's get a beer", date: Date().addingTimeInterval(4.0)),
            ChatMessage.init(senderId: "2", message: "nah", date: Date().addingTimeInterval(5.0)),
            ChatMessage.init(senderId: "2", message: "you can't see this, its my 4th response", date: Date().addingTimeInterval(6.0)),
        ]

let model = ConversationViewModel()
model.setChat(messages)

и реализовать висточник данных табличного представления

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return model.rowsInChat()
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let message = model.messageFor(indexPath)
    if message.senderId == userID {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as! CellTwo
        cell.load(message)
        return cell
    }
    else {
        let cell =tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ConversationTableViewCell
        cell.load(message)
        return cell
    }

}
0 голосов
/ 24 сентября 2018

Тебе нужно послушать, что сказал Рмадди.Вы должны не принимать эти решения в cellForRowAt.Это не то, как работают представления таблиц.

Если вы хотите изменить существование ячейки, измените модель , чтобы numberOfSections и numberOfRowsInSection возвращали разные ответы.К тому времени, когда вызывается cellForRowAt, уже слишком поздно: будет ячейкой в ​​этом ряду, и ваша задача будет ее снабдить.

Опять же, если вы хотите изменитьнезависимо от того, является ли ячейка, скажем, в строке 1, A-ячейкой или B-ячейкой, вы меняете свою модель , чтобы при вызове cellForRowAt она предоставляла правильный тип ячейки и данные.

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