私はチャットの実装にJSQMessageViewControllerを使用しています。 json Postからメッセージを送受信できるようになりました。JSQMessageViewController:致命的なエラー:インデックスが範囲外です
チャット履歴をエラーなしで読み込むことができます。メッセージを取り出すために使用されたタイマー(5秒)。
しばらくの間うまくいき、5秒ごとにメッセージをリロードします。
しばらくして、私は「致命的なエラー:インデックスが範囲外です」という突然下の行にいます。 BELOW
override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {
//app Crashes here : fatal error: Index out of range
return messages[indexPath.item]
}
はCODE VARメッセージIS = 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:文字列){
(:sentBy、SentTo:SentTo、メッセージ:メッセージ、ISTYPE:ISTYPE、SentOn:mesSentOn SentBy) 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(){
//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を追加しましょう
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
}
}
エラーが発生しました。誰か助けてください。
感謝を。私は上記の解決策を試みたが、それは私のために働かなかった。 –