如何从另一个类调用@selector 方法

Posted

技术标签:

【中文标题】如何从另一个类调用@selector 方法【英文标题】:how to call @selector method from another class 【发布时间】:2014-02-13 15:19:29 【问题描述】:

是否可以从另一个类调用@selector 方法? 例如,我创建了一个方法“bannerTapped:”并从“myViewController.m”类中调用它。

myviewcontroller.m:

anotherClass *ac= [[anotherClass alloc]init];

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac action:@selector(bannerTapped:)];
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
cell.conversationImageView.tag = indexPath.row;
[cell.conversationImageView addGestureRecognizer:singleTap];
[cell.conversationImageView setUserInteractionEnabled:YES];

另一个类.m:

-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer 
    //do something here 

更新

viewController.m:

 #import "anotherClass.h"



 +(viewcontroller *)myMethod
 // some code...

 anotherClass *ac= [[anotherClass alloc]init];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac   action:@selector(bannerTapped:)];


另一个类.h:

-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer;

另一个类.m:

-(void)Viewdidload
    [viewController myMethod];
     


   -(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer 
      //do something here 
   

【问题讨论】:

【参考方案1】:

是的,像这样

initWithTarget:anotherClassInstance action:@selector(bannerTapped:)];

Target 是您要将事件发送到的类实例。

编辑

请学会在以后发布您的所有代码,因为您的问题比您所问的要复杂得多。长话短说,你不能这样做:

+(viewcontroller *)myMethod

   anotherClass *ac= [[anotherClass alloc]init];

   UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac   action:@selector(bannerTapped:)];


此方法完成后,ac 将从内存中释放,因为它创建的范围现已消失。在这里使用ARC 没有区别。

这里你需要了解一些不同的东西:

+(void) 使它成为一个类方法,这意味着您无法创建 ac 的实例变量,这在某种意义上是您正在尝试做的事情,但您仍然在错误的位置创建它。 我怀疑(只是根据代码猜测)您认为ac 指向当前位于导航堆栈中的视图控制器。 ac 是该课程的全新副本。您创建了一个不会在任何地方显示或在任何地方使用的新副本,并且在该方法完成后立即死亡。

我的第一段代码回答了您提出的问题,即您如何从另一个类中调用选择器。你现在的问题是你不了解对象流、内存管理、类实例和类方法与实例方法。

请多学习objective-c和面向对象编程,然后再试一次。

【讨论】:

我做到了。现在它向我显示了一个警告未声明的选择器“bannerTapped @user3266009 您是否在该类的.h 文件中声明了bannerTapped 并将其导入到您的viewController 中? 我刚刚在 viewController 类的 .h 中声明了bannerTapped 方法。但是我的应用程序现在崩溃了,给出“无法识别的选择器发送到实例”错误。 @user3266009 ....... 是的,所以回到我上面的评论,如果您在类实例上调用选择器,则当前文件必须知道该方法存在。为此,您可以将anotherClass.himport "anotherClass.h" 中的方法声明到viewController 中。你这样做了吗? @user3266009 请编辑您的问题,包括anotherClass.h 的标头,显示您如何声明实例并将上面的代码更新为您现在所拥有的【参考方案2】:

在下面一行:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:myViewcontroller action:@selector(bannerTapped:)];

您指定为目标的任何对象都是bannerTapped: 选择器将被调用的对象。因此,您只需要在该参数中提供anotherClass 的实例。大多数情况下,人们会将目标设置为包含要添加识别器的视图的视图控制器,但这不是必需的。

【讨论】:

别忘了导入相关的视图控制器。【参考方案3】:

是的,您可以从

中获取目标参数
[[UITapGestureRecognizer alloc]initWithTarget: action:];

指定要运行选择器的类。 您应该记住的一件事是需要分配您的 anotherClass 并且它应该保持强引用。所以最好的方法是创建属性:

@property (nonatomic, strong) anotherClass *myClass;

并确保在将类传递给手势识别器之前分配它,例如:

self.myClass = [[anotherClass alloc[init];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self.myClass action:@selector(bannerTapped:)];
//...

【讨论】:

我没有创建属性,我只是创建了一个“另一个类”的实例并将其实例传递给目标。但它仍然显示警告 将此添加到 anotherClass.h 文件 -(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer;它应该删除警告。 警告消失了!并且应用程序崩溃并给出错误“[nsarray bannerTapped:]unrecognized selector to instance” 看起来您尝试将 NSArray 传递给手势识别器,而不是您的自定义类 -anotherClass。请在创建手势识别器时发布该行,您的目标参数是什么?你是否在 anotherClass.m 文件中声明了bannerTapped: 方法? 是的,我在另一个Class.m 文件中声明了bannerTapped: 方法。【参考方案4】:

您似乎错过了名称末尾的“:”。 @selector(bannerTapped:)

【讨论】:

以上是关于如何从另一个类调用@selector 方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个类调用方法函数?

如何从另一个类调用非静态抽象方法

如何从另一个类调用执行 segue 方法?

如何从另一个 appDomain 调用类的方法

如何从另一个类调用 invalidate() 方法?

如何从另一个类调用viewmodel方法