我先拥有的东西:
我在JSQMessagesViewController.m
中有这个方法:
- (id<JSQMessageData>)collectionView:(JSQMessagesCollectionView *)collectionView messageDataForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSAssert(NO, @"ERROR: required method not implemented: %s", __PRETTY_FUNCTION__);
return nil;
}
然后MessagesViewController.swift
带有子类:
class MessagesViewController: JSQMessagesViewController {
使用此方法:
func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath: NSIndexPath!) -> JSQMessageData! {
return messages[messageDataForItemAtIndexPath.item]
}
班级MessagesViewController
显而易见的“问题”:
当我运行应用程序时,我收到此错误:
ERROR: required method not implemented: -[JSQMessagesViewController collectionView:messageDataForItemAtIndexPath:]'
所以,显然正在调用JSQMessagesViewController.m
中的方法。
我试图解决它,以及真正的问题:
将swift方法重命名为:
func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath: NSIndexPath!) -> JSQMessageData! {
Method 'collectionView(_:messageDataForItemAtIndexPath:)' with Objective-C selector 'collectionView:messageDataForItemAtIndexPath:' conflicts with method 'collectionView(_:messageDataForItemAt:)' from superclass 'JSQMessagesViewController' with the same Objective-C selector
然后添加覆盖前缀以防止上述冲突:
override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath: NSIndexPath!) -> JSQMessageData! {
Method does not override any method from its superclass
我想知道的事情:
我想理解第1点之间的矛盾(方法与其超类同名方法之间的冲突)和2.(没有同名的超类方法)。
运行代码假设正在使用的控制器是类MessagesViewController
而不是JSQMessagesViewController
(因为这是在Identity检查器中编写的类),并调用[object collectionView: ...,messageDataForItemAtIndexPath:...]使用swift子类方法。
答案 0 :(得分:3)
试试这个定义(Swift 3):
override func collectionView(_ collectionView: JSQMessagesCollectionView, messageDataForItemAt indexPath: IndexPath) -> JSQMessageData {
// return your item
}
我差不多6个月前在我的项目中使用过它。
P.S。 JSQMessagesViewController现已弃用,不再维护。您可以改为使用MessageKit。
P.P.S。您可以详细了解如何将Objective-c方法导入Swift here。