可以从另一个类调用@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];
anotherClass.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:)];
}
anotherClass.h:
-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer;
anotherClass.m:
-(void)Viewdidload{
[viewController myMethod];
}
-(void)bannerTapped:(UIGestureRecognizer *)gestureRecognizer {
//do something here
}
答案 0 :(得分:5)
是的,就像这样
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
指向当前位于导航堆栈中的viewController。 ac
是该类的全新副本。您创建了一个新副本,该副本不会在任何地方显示或在任何地方使用,并且只要该方法完成就会立即死亡。我的第一段代码回答了你问的问题,就是你如何从另一个类调用选择器。您现在的问题是您不了解对象,内存管理,类实例和类方法与实例方法的对比。
请更多地研究objective-c和面向对象的编程,然后再试一次。
答案 1 :(得分:1)
在以下行中:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:myViewcontroller action:@selector(bannerTapped:)];
无论您指定什么,因为目标是将调用bannerTapped:
选择器的对象。所以你只需要在该参数中提供anotherClass
的实例。大多数情况下,人们将目标作为视图控制器,其中包含他们正在添加识别器的视图,但这不是必需的。
答案 2 :(得分:1)
是的,您可以使用
中的目标参数[[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:)];
//...
答案 3 :(得分:-1)
好像您错过了名称末尾的“:”。 @selector(bannerTapped:)