如何从另一个类调用@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.h
和import "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 方法的主要内容,如果未能解决你的问题,请参考以下文章