如何运行Objective-C类的子类的Swift方法,该方法具有相同名称的方法

时间:2018-02-07 21:30:20

标签: ios objective-c swift

我先拥有的东西:

  • 我在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中的方法。

我试图解决它,以及真正的问题:

  1. 将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
  2. 然后添加覆盖前缀以防止上述冲突:

    override func collectionView(_ collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath: NSIndexPath!) -> JSQMessageData! {
    
    • 但后来我得到了:Method does not override any method from its superclass
  3. 我想知道的事情:

    1. 我想理解第1点之间的矛盾(方法与其超类同名方法之间的冲突)和2.(没有同名的超类方法)。

    2. 运行代码假设正在使用的控制器是类MessagesViewController而不是JSQMessagesViewController(因为这是在Identity检查器中编写的类),并调用[object collectionView: ...,messageDataForItemAtIndexPath:...]使用swift子类方法。

1 个答案:

答案 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