【问题标题】:JSQMessageViewController: fatal error: Index out of rangeJSQMessageViewController:致命错误:索引超出范围
【发布时间】:2018-04-20 02:32:01
【问题描述】:

我正在使用 JSQMessageViewController 来实现聊天。 我可以通过 json Post and get 发送和接收消息。

我能够毫无错误地加载我的聊天记录。使用 timer(5 sec) 来检索消息。

它可以正常工作一段时间,它每 5 秒重新加载一次消息。

一段时间后,我突然在下面一行收到“致命错误:索引超出范围”。

override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {

     //app Crashes here : fatal error: Index out of range  
         return messages[indexPath.item]


}

下面是代码 var messages = JSQMessage

var outgoingBubbleImageView:JSQMessagesBubbleImage! //= JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: UIColor.jsq_messageBubbleGreen())
var incomingBubbleImageView:JSQMessagesBubbleImage! //= JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray())


 var batchMessages = true

// Refresh Messages
var timer : Timer!

// Don't double load!
var isLoading = false

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView!.collectionViewLayout.incomingAvatarViewSize = CGSize.zero
    collectionView!.collectionViewLayout.outgoingAvatarViewSize = CGSize.zero

    outgoingBubbleImageView = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImage(with: uicolorFromHex(0xDCF8C7))
    incomingBubbleImageView = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImage(with: UIColor.jsq_messageBubbleLightGray()) //uicolorFromHex(0xF6F6F6)


    let defaults = UserDefaults.standard
    let usertype = defaults.object(forKey: "UserType") as! String

    self.userType = usertype

// self.getChatHistory(ipAddress+"/VIOService.svc/JSONService/chatorderhistoryget/"+EmailId+"/"+toEmail+"/"+OrderId) // self.finishReceivingMessage()

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Close", style: .plain, target: self, action: #selector(addTapped))
    self.sender = userType

    self.inputToolbar.contentView?.leftBarButtonItem = nil


    // This is a beta feature that mostly works but to make things more stable it is diabled.
    collectionView?.collectionViewLayout.springinessEnabled = false

    automaticallyScrollsToMostRecentMessage = true

   // self.collectionView?.reloadData()
   self.collectionView?.layoutIfNeeded()




   self.isLoading = false

  self.loadMessages()


}


override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    collectionView!.collectionViewLayout.springinessEnabled = false


 timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(ChatMessagesViewController.loadMessages), userInfo: nil, repeats: true)


}

func addMessage(_ id: String, text: String) {
    print("add message: \(text)")



    let message = JSQMessage(senderId: id, displayName: "Me", text: text)


    messages.append(message)



}

func loadMessages() {

// self.messages = [JSQMessage]()

  //  self.messages.removeAll()

  if self.isLoading == false {

        isLoading = true

        self.getChatHistory(mYURL)


        finishReceivingMessage()


    }

}

func getChatHistory(_ url:String) {

messages.removeAll()
  //  messages.removeAll(keepingCapacity: true)

    let requestURL: URL = URL(string: url)!
    let urlRequest: NSMutableURLRequest = NSMutableURLRequest(url: requestURL)
    let session = URLSession.shared
    let task = session.dataTask(with: urlRequest as URLRequest) {data,response,error in

        let httpResponse = response as! HTTPURLResponse
        let statusCode = httpResponse.statusCode

        if (statusCode == 200) {
            print("everything is fine, file downloaded successfully.")

            print(response!)


            do{



                let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments)

                if let items = json as? [[String: AnyObject]] {



                    for item in items {

                        if let sentBy = item["SentBy"] as? String {

                            if let SentTo = item["SentTo"] as? String {

                                if let Message = item["Msg"] as? String {

                                    if let IsType = item["IsType"] as? String  {

                                        if let mesSentOn = item["MsgSenton"] as? String //Date {

                                        {

//
让添加 = chatHistory(SentBy: sendBy, SentTo: SentTo, Message: Message, IsType: IsType, SentOn: mesSentOn)

                                            self.chatHist.append(add)

                                            self.from = SentTo
                                            self.to = sentBy

                                            var message:String=""

                                            if let range = Message.range(of: ";") {

                                             message = Message.substring(from: range.upperBound)
                                            }

                                           self.addMessage(IsType, text: message)


                                        }
                                    }
                                }
                            }

                        }

                     self.do_collectionView_refresh()

                    }



                }



            }
            catch {

                print("Error with Json: \(error)")
            }

        }
    }


    isLoading = false

    task.resume()



}

func do_collectionView_refresh() {

    DispatchQueue.main.async {

        self.collectionView?.reloadData()

    }
}


override func senderId() -> String {
    return userType
}

override func senderDisplayName() -> String {
    return "Me"
}

override func collectionView(_ collectionView: UICollectionView,
                             numberOfItemsInSection section: Int) -> Int {

    if messages.count > 0 {

        return messages.count
    }
    else {

        return 0
    }


  //  return messages.count
}


override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {

     //app Crashes here : fatal error: Index out of range  
         return messages[indexPath.item]


}


override func collectionView(_ collectionView: JSQMessagesCollectionView, messageBubbleImageDataForItemAt indexPath: IndexPath) -> JSQMessageBubbleImageDataSource {

//    return messages[indexPath.item].senderId == self.senderId() ? outgoingBubble : incomingBubble

    let message = messages[indexPath.item]

    //   let message = chatHist[indexPath.item]
    // 1
    if message.senderId == userType { //

        return outgoingBubbleImageView
    } else { // 3
        return incomingBubbleImageView
    }

}

我遇到了错误,请有人帮忙。

【问题讨论】:

  • @DilipTiwari 是的,我解决了这个问题..让我知道你在找什么。
  • 你能帮我吗?我需要在聊天页面中显示 json 响应,兄弟@JB29.4 帮帮我
  • 是的,我仍在使用计时器来加载我的消息。
  • 你能分享你的代码jsoneditoronline.org/?id=7730bbdde4e44a41a302647d3192bfa6这是我的json你可以为你创建一个私人聊天吗@JB29.4
  • 当然,伙计,我现在有点忙...会查看您的 JSON

标签: swift fatal-error jsqmessagesviewcontroller indexoutofrangeexception


【解决方案1】:

如果这有什么不同,请告诉我:

 override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count

}

override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAt indexPath: IndexPath!) -> JSQMessageData! {

    let data = self.messages[indexPath.row]
    return data

}

 override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAt indexPath: IndexPath!) -> JSQMessageBubbleImageDataSource! {

    let data = messages[indexPath.row]
    switch(data.senderId) {
    case self.senderId:
        return self.outgoingBubbleImageView
    default:
        return self.incomingBubbleImageView
    }
}

【讨论】:

  • 感谢@Alex7 的回复。我尝试了上述解决方案,但对我不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多