2016-04-02 6 views
0

Я новичок в быстром: D и разработке простого приложения для чата с помощью JSQMessagesViewController. Я прочитал &, следуя примеру JSQMessagesViewController (https://www.syncano.io/blog/create-ios-chat-app-part1/), но в моем коде произошла ошибка.NSInvalidArgumentException с использованием 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!) { 

    } 
} 

Когда я запускаю его, сообщения об ошибке сказать

*** Нагрузочному приложение из-за неперехваченное исключение 'NSInvalidArgumentException', причина: «- [JSQMessage messageHash]: непризнанный селектор направил к экземпляру 0x7fdf0a6e1f60 '

и приложение прекращается.

Но это хорошо работает после удаления

self.addDemoMessages()

код в viewDidLoad(). Поэтому я предполагаю, что в этом коде возникает ошибка, но я не знаю, как исправить :(Как это исправить?

ответ

1

У меня была аналогичная проблема с этим, когда я подклассифицировал объект JSQMessage.Если вы это делаете, необходимо убедиться, что вы реализовать имеет для данных сообщения. Я просто должен был добавить этот метод к моему message объекта

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

Надежда, что помогает

Смежные вопросы