Objective c 如何从另一个类调用@selector方法
可以从另一个类调用@selector方法吗? 例如,我创建了一个方法“bannerTapped:”并从“myViewController.m”类调用它 myviewcontroller.m:Objective c 如何从另一个类调用@selector方法,objective-c,ios7,uitapgesturerecognizer,instance-methods,Objective C,Ios7,Uitapgesturerecognizer,Instance Methods,可以从另一个类调用@selector方法吗? 例如,我创建了一个方法“bannerTapped:”并从“myViewController.m”类调用它 myviewcontroller.m: anotherClass *ac= [[anotherClass alloc]init]; UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:ac action:@selector(banne
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
}
是的,像这样
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
- 我怀疑(只是根据代码猜测)您认为
指向当前在导航堆栈中的viewControllerac
是该类的全新副本。您已经创建了一个新副本,该副本不在任何地方显示或使用,并在该方法完成后立即消失ac
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:myViewcontroller action:@selector(bannerTapped:)];
指定为目标的任何对象都是将调用
横幅映射:
选择器的对象。因此,您只需要在该参数中提供另一个类的实例。大多数情况下,用户的目标都是视图控制器,其中包含要向其中添加识别器的视图,但这不是必需的。是,您可以从中选择目标参数
[[UITapGestureRecognizer alloc]initWithTarget: action:];
指定要运行选择器的类。
只有一件事你应该记住,你的另一个类需要被分配,它应该保持强引用。因此,最好的方法是创建属性:
@property (nonatomic, strong) anotherClass *myClass;
并确保在将类传递给手势识别器之前已分配该类,例如:
self.myClass = [[anotherClass alloc[init];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self.myClass action:@selector(bannerTapped:)];
//...
看起来您错过了名称末尾的“:”。
@选择器(bannerTapped:)别忘了导入相关的视图控制器。我没有创建属性,我只是创建了“另一个类”的实例并将其实例传递到目标中。但它仍然显示警告将此添加到另一个class.h文件-(void)bannerTapped:(uigestureRecognitizer*)gestureRecognitizer;它应该删除警告。警告万西!应用程序崩溃,出现错误“[nsarray bannerTapped:]无法识别的选择器到实例”看起来您试图将nsarray传递给手势识别器,而不是您的自定义类-另一个类。请在创建手势识别器时张贴该行,目标参数是什么?您在另一个class.m文件中声明了bannerTapped:method吗?是的,我在另一个class.m文件中声明了bannerTapped:method。我声明了。现在它向我显示一个警告“未声明的选择器”bannerTapped@user3266009您是否在该类的.h文件中声明了bannerTapped并将其导入到您的viewController中?我刚刚在viewController类的.h文件中声明了bannerTapped方法。但我的应用程序现在崩溃,导致“无法识别的选择器发送到实例”“错误。@user326609……”。。。。。。。是的,那么回到我上面的评论,如果您在类实例上调用选择器,当前文件必须知道该方法存在。您可以通过在
anotherClass.h
中声明方法,并将“anotherClass.h”
导入视图控制器中来实现。您完成了吗?@user326609请编辑您的问题,包括anotherClass.h
的标题,展示您如何声明实例,并将上面的代码更新为您现在拥有的代码