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

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

可以从另一个类调用@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 
   }
是的,像这样

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和面向对象编程,然后再试一次。

下一行:

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
的标题,展示您如何声明实例,并将上面的代码更新为您现在拥有的代码