objective-c - Swift 3 - 父类(super class)方法正在执行而不是它的覆盖对应物

标签 objective-c swift inheritance methods overriding

如何重写 ViewControllerA 类中的 ObjC 方法 runThisMethodcontroller:didChangeObject:,以便应用程序执行对应的方法来自 Swift 子类 ViewControllerC,而不是?在下面的代码中,[ViewControllerA runThisMethod(someParameter)] 将在应用检测到 fetchedResultsController 发生变化时执行(通过 [ViewControllerA controller:didChangeObject:]。有人可以帮我吗看看我错过了什么?

Main.swift

let vc = ViewControllerC.init()
self.myNavigationController?.pushViewController(vc, animated: true)

ViewControllerA.h

@interface ViewControllerA : UIViewController <NSFetchedResultsControllerDelegate>
    @property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
    - (void)setUpFetchedResultsController;
    - (void)runThisMethod:(SomeParameterClass *)someParameter;
@end

ViewControllerA.m

@implementation ViewControllerA
    - (void)setUpFetchedResultsController
    {
        // build fetch "request" here
        self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[[MYCoreDataManager sharedCoreDataManager] managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
        self.fetchedResultsController.delegate = self;
    }

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)someParameter atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
    {
        [self runThisMethod:someParameter]
    }

    - (void)runThisMethod:(SomeParameterClass *)someParameter
    {
        NSLog(@"This method will execute")
    }
@end

ViewControllerB.h

@interface ViewControllerB : ViewControllerA
    // declare a bunch of properties
@end

ViewControllerB.m

@implementation ViewControllerB

    - (void)viewWillAppear:(BOOL)animated {
        [self setUpFetchedResultsController];
    }

@end

ViewControllerC.swift

class ViewControllerC: ViewControllerB {

    override func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange someParameter: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        // this function won't run
        self.runThisMethod(someParameter)
    }

    override func runThisMethod(someParameter){
        // this function won't run
    }
}

最佳答案

当我使用您提到的代码设置一个示例项目时(并设置一个在 ViewControllerB.h 中导入的桥接头文件),ViewControllerC 上被覆盖的 runThisMethod 正确执行。这是 Xcode 8.2.1。因此,一切似乎都按照您提到的设置正常工作。

您能否上传一个示例项目来展示您提到的行为,以便我们查看?我怀疑某处设置不正确......

您可能没有做的一件事(因为您只提供了部分代码)是在 ViewControllerC 中覆盖 NSFetchedResultsController 的 didChangeObject 委托(delegate)方法。

关于objective-c - Swift 3 - 父类(super class)方法正在执行而不是它的覆盖对应物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689412/

相关文章:

ios - iOS 中的动态 Xml 解析

ios - swift UIImage 蓝色正方形

swift - 通过今天的扩展打开主应用程序

ios - 带有图像的 CollectionView 网格。图片不适合网格

objective-c - 在什么情况下,我们需要在 ARC 下编写 __autoreleasing 所有权限定符?

ios - 一旦访问过的 PFObject 不应再次检索

swift - 在 While Loop Swift 中更新标签

javascript - JavaScript 中使用扩展运算符的原型(prototype)继承

继承类上的 C# 无参数构造函数

java - 如何检查对象是否属于子对象