2016-04-02 7 views
0

Ich bin neu zu swift: D, und eine einfache Chat-Anwendung mit dem JSQMessagesViewController zu entwickeln. Ich lese & folgte JSQMessagesViewController Beispielprojekt (https://www.syncano.io/blog/create-ios-chat-app-part1/), aber mein Code tritt auf einen Fehler.NSInvalidArgumentException mit JSQMessagesViewController

class ChatRoomViewController: JSQMessagesViewController { 

    let incomingBubble = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImageWithColor(UIColor(red: 10/255, green: 180/255, blue: 230/255, alpha: 1.0)) 
    let outgoingBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImageWithColor(UIColor.lightGrayColor()) 
    var messages = [JSQMessage]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     self.setup() 
     self.addDemoMessages() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func reloadMessagesView() { 
     self.collectionView?.reloadData() 
    } 

    func gotoReserve() { 

     let nextViewController = ReserveViewController(nibName: "ReserveViewController", bundle: nil) 

     self.navigationController!.pushViewController(nextViewController, animated: true) 
    } 
} 

//MARK - Setup 
extension ChatRoomViewController { 
    func addDemoMessages() { 
     let message = JSQMessage(senderId: "zzz", displayName: "aaa", text: "asasd") 
     self.messages.append(message) 

     self.reloadMessagesView() 
    } 

    func setup() { 
     self.senderId = "user" 
     self.senderDisplayName = "user" 
    } 
} 
//MARK - Data Source 
extension ChatRoomViewController { 

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

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! { 
     let data = self.messages[indexPath.row] 
     return data 
    } 

    override func collectionView(collectionView: JSQMessagesCollectionView!, didDeleteMessageAtIndexPath indexPath: NSIndexPath!) { 
     self.messages.removeAtIndex(indexPath.row) 
    } 

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! { 
     let data = messages[indexPath.row] 
     switch(data.senderId) { 
     case self.senderId: 
      return self.outgoingBubble 
     default: 
      return self.incomingBubble 
     } 
    } 

    override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! { 
     return nil 
    } 
} 
//MARK - Toolbar 
extension ChatRoomViewController { 
    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: NSDate!) { 
     let message = JSQMessage(senderId: senderId, senderDisplayName: senderDisplayName, date: date, text: text) 
     self.messages += [message] 
     self.finishSendingMessage() 
    } 

    override func didPressAccessoryButton(sender: UIButton!) { 

    } 
} 

Wenn ich es laufen, die Fehlermeldung sagen

*** App beenden aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: ‚- [JSQMessage messageHash]: Unbekannter Selektor an Instanz gesendet 0x7fdf0a6e1f60 '

und die App ist beendet.

Aber es läuft gut nach

self.addDemoMessages()

Code in viewDidLoad() gelöscht werden. Also ich denke, dass dieser Code Fehler auftritt, aber ich weiß nicht, wie zu beheben :(Wie kann ich es beheben?

Antwort

1

Ich hatte ein ähnliches Problem mit diesem, wenn ich das JSQMessage Objekt unterklassifiziert. Wenn Sie das tun Sie gerade vornehmen müssen Sie sicher, dass Sie bei der Implementierung der hat für die Nachrichtendaten. ich musste nur diese Methode, um meine message Objekt hinzufügen

func messageHash() -> UInt { 
    return UInt(self.hash) 
} 

Hoffnung, die

hilft
Verwandte Themen