ios - 无法通过主类的选择器调用类别方法

标签 ios objective-c overriding objective-c-category

我有一个方法:

+ (id) showModalFromController: (UIViewController*) controller
{
    AxEmpAuthorizationController * autorizationController = [[self.class alloc] initWithNibName:NSStringFromClass(self.class) bundle:nil];
    [autorizationController performSelectorOnMainThread: @selector(showModalFromController:) withObject: controller waitUntilDone: YES];
    return [autorizationController authorelease];
}

我有一个类别AxEmpAuthorizationController+CustomLoginVC.h,我在其中覆盖了方法:

- (void) showModalFromController: (UIViewController*) controller
{
    NavigationTopViewController* navigationController = [[NavigationTopViewController allocWithZone: NULL] initWithRootViewController: self];
    [controller presentModalViewController: navigationController animated: ![self.class isMain]];
    [navigationController release];
}

问题是category中的方法从来没有被调用过,我找不到问题所在。有帮助吗?

最佳答案

这里的一个问题是您没有覆盖该方法。选择器将是相同的(我相信)- @selector(showModalFromController:),但方法不同。一个有不同的返回类型,一个是类方法(以'+'开头),一个是实例方法(以'-'开头)。

您需要确保您的替换方法具有签名:

+ (id) showModalFromController: (UIViewController*) controller

而不是

- (void) showModalFromController: (UIViewController*) controller

一旦你解决了这个问题,你就更近了一步。

正如 rmaddy 上面评论的那样,您可能不想使用类别来覆盖方法。

如果您正在尝试替换行为,请考虑子类化并在您需要的地方使用新的子类。

如果您尝试隐蔽地执行某些操作 - 在整个应用程序中替换此方法,请考虑方法调配(请非常仔细地考虑此选项)。

关于ios - 无法通过主类的选择器调用类别方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221102/

相关文章:

ios - 如何使用一个选择器创建一个按多个键排序的 NSSortDescriptor

ios - 覆盖 UIScrollView 子类中的委托(delegate)属性

objective-c - StoryBoard 处理继承的 View Controller

objective-c - 为什么 fget 不工作?

Python xlwt - 使列只读(单元格保护)

ios - SwiftUI 中的后缘和前缘是什么意思?

objective-c - AVFoundation 将 Swift 代码更改为 Objective-C

java - 如何重写子类的equals方法

java - 为什么我不能在 Android 上使用 Override 注释?

ios - 如何使用swift在ios上选择和删除诸如whatsapp或iMessage之类的消息