【问题标题】:how to call @selector method from another class如何从另一个类调用@selector 方法
【发布时间】: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 
   }

【问题讨论】:

    标签: objective-c ios7 uitapgesturerecognizer instance-methods


    【解决方案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.himport "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:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2019-08-16
      相关资源
      最近更新 更多