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

时间:2014-02-13 15:19:29

标签: 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(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 
   }

4 个答案:

答案 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:)