Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 正在执行Swift 3-超类方法,而不是其重写对应方法_Objective C_Swift_Inheritance_Methods_Overriding - Fatal编程技术网

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
方法。我稍后会尝试并发布结果。在这种情况下(我无法共享代码),我通常会做的是复制原始项目,并将所有内容缩减到最低限度的必要类和代码,在这些类和代码中仍然显示问题。有时候,仅仅是把事情精简一下就可以看出问题所在。如果没有,那么您有一个简单的示例项目,可以与其他人共享。也许这会有帮助?