Reputation: 2798
I'm trying to implement the awesome library JSQMessagesViewController but I keep getting the error "'ModelMessage' does not conform to protocol 'JSQMessageData'" even though my class inherit from NSObject and I implement the required properties
Here is the protocol:
@protocol JSQMessageData <NSObject>
@required
- (NSString *)senderId;
- (NSString *)senderDisplayName;
- (NSDate *)date;
- (BOOL)isMediaMessage;
- (NSUInteger)messageHash;
@optional
- (NSString *)text;
- (id<JSQMessageMediaData>)media;
@end
and here is my class
import Foundation
class ModelMessage: Model, JSQMessageData {
/* Required */
var senderId: NSString
var senderDisplayName: NSString
var date: NSDate
var isMediaMessage: Bool
var messageHash: UInt
/**/
var text_: String
var id:String!
var conversationId: String!
var imageUrl: String?
var recipientId: String!
var recipientRead: Bool!
var avatar: NSData?
init(data: NSDictionary){
super.init()
/* Required */
self.senderId = getStringFromJSON(data, key:"senderId")
self.senderDisplayName = "Me"
let dateString = getStringFromJSON(data, key: "timeStamp")
let dateDouble = (dateString as NSString).doubleValue / 1000.0
self.date = NSDate(timeIntervalSince1970: dateDouble)
self.isMediaMessage = false
/**/
self.text_ = getStringFromJSON(data, key:"text")
self.id = getStringFromJSON(data, key:"id")
self.conversationId = getStringFromJSON(data, key:"conversationId")
self.recipientId = getStringFromJSON(data, key:"recipientId")
self.recipientRead = data["recipientRead"] as! Bool
}
}
which inherit from
import Foundation
class Model: NSObject
{
func getStringFromJSON(data: NSDictionary, key: String) -> String {
if let info = data[key] as? String{
return info
}
return ""
}
}
Upvotes: 0
Views: 1879
Reputation: 4676
Try using implicitly unwrapped optionals when implementing ObjC protocols without nullability annotations. Also you can and should always use String
instead of NSString
.
var senderId: String!
var senderDisplayName: String!
var date: NSDate!
var isMediaMessage: Bool
var messageHash: UInt
Annotating the whole class and/or the properties with @objc
could also help.
If that still doesn't work then check the build log as it will tell you what protocol function is missing or not implemented correctly.
Upvotes: 2
Reputation: 5388
try this
import Foundation
class ModelMessage: NSObject , JSQMessageData {
/* Required */
var senderId: NSString
var senderDisplayName: NSString
var date: NSDate
var isMediaMessage: Bool
var messageHash: UInt
/**/
var text_: String
var id:String!
var conversationId: String!
var imageUrl: String?
var recipientId: String!
var recipientRead: Bool!
var avatar: NSData?
init(data: NSDictionary){
super.init()
/* Required */
self.senderId = getStringFromJSON(data, key:"senderId")
self.senderDisplayName = "Me"
let dateString = getStringFromJSON(data, key: "timeStamp")
let dateDouble = (dateString as NSString).doubleValue / 1000.0
self.date = NSDate(timeIntervalSince1970: dateDouble)
self.isMediaMessage = false
/**/
self.text_ = getStringFromJSON(data, key:"text")
self.id = getStringFromJSON(data, key:"id")
self.conversationId = getStringFromJSON(data, key:"conversationId")
self.recipientId = getStringFromJSON(data, key:"recipientId")
self.recipientRead = data["recipientRead"] as! Bool
}
func getStringFromJSON(data: NSDictionary, key: String) -> String {
if let info = data[key] as? String{
return info
}
return ""
}
}
Upvotes: 0