0

Ich verwende JSQMessageViewController für die Chat-Implementierung. Ich bin in der Lage, Nachrichten über JSON Post zu senden und zu empfangen und zu erhalten.JSQMessageViewController: Schwerwiegender Fehler: Index außerhalb des Bereichs

Ich kann meinen Chat-Verlauf ohne Fehler laden. verwendeter Timer (5 Sek.) zum Abrufen der Nachrichten.

Es funktioniert gut für einige Zeit, es lädt die Nachrichten für jeweils 5 Sekunden.

nach einer Weile bekomme ich "fataler Fehler: Index außerhalb des Bereichs" plötzlich auf unter Linie.

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

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


} 

UNTEN CODE 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 { 

             { 

//
lassen add = chatHistory (SentBy: sentBy, SentTo: SentTo, Nachricht: Nachricht, 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 
    } 

} 

Ich bin mit dem Fehler fest, bitte jemand helfen.

Antwort

0

Lassen Sie mich wissen, ob dies einen Unterschied macht:

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 
    } 
} 
+0

Danke für die Antwort @ Alex7. Ich habe versucht oben Lösung, aber es hat nicht für mich funktioniert. –

Verwandte Themen