Objective c 正在执行Swift 3-超类方法,而不是其重写对应方法
如何从Objective c 正在执行Swift 3-超类方法,而不是其重写对应方法,objective-c,swift,inheritance,methods,overriding,Objective C,Swift,Inheritance,Methods,Overriding,如何从ViewControllerA类重写ObjC方法runThisMethod和controller:didChangeObject:,以便应用程序执行Swift子类ViewControllerC中的对应项?在下面的代码中,当应用程序检测到fetchedResultsController中的更改时,[ViewControllerA runThisMethod(someParameter)]将执行(通过[ViewControllerA controller:didChangeObject://c
ViewControllerA
类重写ObjC方法runThisMethod
和controller:didChangeObject:
,以便应用程序执行Swift子类ViewControllerC
中的对应项?在下面的代码中,当应用程序检测到fetchedResultsController中的更改时,[ViewControllerA runThisMethod(someParameter)]
将执行(通过[ViewControllerA controller:didChangeObject://code>。有人能帮我看看我缺少了什么吗
Main.swift
let vc = ViewControllerC.init()
self.myNavigationController?.pushViewController(vc, animated: true)
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
}
}
ViewControllerA.h
@interface ViewControllerA : UIViewController <NSFetchedResultsControllerDelegate>
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
- (void)setUpFetchedResultsController;
- (void)runThisMethod:(SomeParameterClass *)someParameter;
@end
@interface ViewControllerB : ViewControllerA
// declare a bunch of properties
@end
ViewControllerB.h
@interface ViewControllerA : UIViewController <NSFetchedResultsControllerDelegate>
@property (nonatomic, strong) NSFetchedResultsController *fetchedResultsController;
- (void)setUpFetchedResultsController;
- (void)runThisMethod:(SomeParameterClass *)someParameter;
@end
@interface ViewControllerB : ViewControllerA
// declare a bunch of properties
@end
ViewControllerB.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
@implementation ViewControllerB
- (void)viewWillAppear:(BOOL)animated {
[self setUpFetchedResultsController];
}
@end
ViewControllerC.swift
let vc = ViewControllerC.init()
self.myNavigationController?.pushViewController(vc, animated: true)
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
}
}
class ViewControllerC:ViewControllerB{
重写func控制器(controller:NSFetchedResultsController,didChange someParameter:Any,在indexPath:indexPath?处,对于类型:NSFetchedResultsChangeType,newIndexPath:indexPath?){
//此函数将不运行
self.runThisMethod(someParameter)
}
重写func runThisMethod(someParameter){
//此函数将不运行
}
}
当我使用您提到的代码设置一个示例项目(并设置一个桥接头文件,该文件导入到ViewControllerB.h中)时,ViewControllerC上被重写的runthis方法正确执行。这是在Xcode 8.2.1中实现的。因此,在您提到的设置中,一切似乎都正常工作
您是否可以上传一个显示您提到的行为的示例项目,以便我们可以查看一下?我怀疑某处设置不正确
有一件事您可能没有做(因为您只提供了部分代码)正在重写ViewControllerC中NSFetchedResultsController的didChangeObject委托方法。发现问题出在我的fetchedResultsController
属性的谓词中。谓词有一个参数,该参数将导致执行提取时fetchResultsController
始终为零。因此,委托方法,controller:didChangeObject:
未被触发。您是否尝试过使用@objc
标记执行runThisMethod()
?刚刚尝试过,但也不起作用。谢谢,法希姆。我刚刚更新了问题,在ViewControllerC中重写了didChangObject委托方法,但它仍然没有执行ViewControllerC。运行此方法
。我实际上认为我不需要重写didChangeObject委托方法,因为我没有从Vie中更改代码wControllerA。您介意发布ViewControllerC.swift的代码吗?因为似乎是您的代码有问题,所以如果您创建一个示例项目来说明此问题并将其上载到某个地方,可能会更容易。我的ViewControllerC是基本的,只有您上面发布的两种方法,或者类似的方法。当然,我如果您的代码与此处显示的完全相同,那么您对ViewControllerC中的runThisMethod的重写版本有问题,因为该版本不包含参数:),但我认为这只是您忽略的内容?您是对的,Fahim。它确实有一个参数。。。我粗心的错误。我已经更新了这个问题。Re:共享代码,我不能这样做,因为我不能自由地处理我客户的工作,我没有任何可以快速修改的基本应用程序。我怀疑我没有正确设置fetchResultsController
委托属性和/或我需要为子类创建另一个fetchResultsController
,以便触发重写的controller:didChangeObject
方法。我稍后会尝试并发布结果。在这种情况下(我无法共享代码),我通常会做的是复制原始项目,并将所有内容缩减到最低限度的必要类和代码,在这些类和代码中仍然显示问题。有时候,仅仅是把事情精简一下就可以看出问题所在。如果没有,那么您有一个简单的示例项目,可以与其他人共享。也许这会有帮助?