gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:23:23 27 4
gpt4 key购买 nike

如何重写 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com