如何重写 ViewControllerA
类中的 ObjC 方法 runThisMethod
和 controller: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/