【问题标题】:How to call method from another class in iOS?如何从 iOS 中的另一个类调用方法?
【发布时间】:2012-11-12 10:19:03
【问题描述】:

我有 2 节课。第一个是Label,另一个是LabelGestureRecognizer。在 LabelGestureRecognizer 中有一个名为 getName 的方法,我想通过 Label 类调用该方法。

下面是我的问题的一个简单示例。
我正在尝试调用方法“getName”,但我收到一条错误消息: “‘LabelGestureRecognizer’没有可见的@interface声明选择器‘getName:’”

ViewController.h:

@property (nonatomic, strong) UILabel *valueLabel;

ViewController.m:

- (void)viewDidLoad
{
    valueLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 366, 320, 50)];
    valueLabel.textAlignment = UITextAlignmentCenter;
    valueLabel.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:valueLabel]; 
}

- (void) wheelDidChangeValue:(NSString *) newValue {
    self.valueLabel.text = newValue;
}

标签.h:

@protocol LabelDelegate <NSObject> 
@required
 -(void) wheelDidChangeValue:(NSString *) newValue;
@end

@class LabelGestureRecognizer;

LabelGestureRecognizer.m:

- (NSString *) getName:(int) position
{
    NSString *resultat = @"";
    switch (position) {
        case 0:
            resultat = @"Test 1";
            break;
        case 1:
            resultat = @"Test 2";
            break;
        default:
            break;
    }
    return resultat;
}

LabelGestureRecognizer.h:

 @interface LabelGestureRecognizer : UIGestureRecognizer
 {
     NSDate *previous;
     double current;
 }

标签.m:

 LabelGestureRecognizer *recognizer = [[LabelGestureRecognizer alloc] init];
 [self.delegate wheelDidChangeValue:[self getName:0]];

【问题讨论】:

  • " 我有一个名为 Label.m 的类,我想从 LabelGestureRecognizer 类中调用一个名为 getName 的方法。" 这看起来有点令人困惑。根据示例,getNameLabelGestureRecognizer 中,您正尝试从Label 类中调用。但你的说法正好相反。哪个是正确的?
  • 我认为错误消息“'LabelGestureRecognizer' 没有可见的@interface 声明选择器'getName:”清楚地表明您没有在 .h 文件中声明 getName 方法。您能否将 .h 文件代码添加到问题中。我确定您没有在此处声明或使用错误的签名声明。
  • 我已经用上面的 .h 文件更新了我的答案。请检查并告诉我。

标签: iphone ios class methods label


【解决方案1】:

当您在Label.m 中使用self 时,它代表当前的类对象。如果你需要代表LabelGestureRecognizer对象,你需要用它代替self作为,

[self.delegate wheelDidChangeValue:[recognizer getName:0]];

您还应该在LabelGestureRecognizer.h 文件中声明以下内容,

@interface LabelGestureRecognizer : UIGestureRecognizer
 {
     NSDate *previous;
     double current;
 }
- (NSString *) getName:(int) position;
@end

您的错误消息是说它无法在LabelGestureRecognizer.h 类文件中看到getName 方法的声明。

【讨论】:

    【解决方案2】:

    它可能发生的原因有很多,但通常是说在它标记的代码行中,它没有看到任何证据表明您引用的选择器位于它认为对象具有的类型的接口中.

    【讨论】:

      【解决方案3】:

      需要在LabelGestureRecognizer.h的接口中声明选择器

       @interface
       - (NSString *) getName:(int) position;
       @end
      

      【讨论】:

        【解决方案4】:

        您好,您可以通过 alloc 类简单地创建一个类的实例并调用该方法,使用后您可以释放它

        LabelGestureRecognizer *labelGestureRecognizer = [[LabelGestureRecognizer alloc] init];
        
        [self.delegate wheelDidChangeValue:[labelGestureRecognizer getName:0]];
        [labelGestureRecognizer release];
        

        但是作为你的代码,我会建议创建类方法

        + (NSString *) getName:(int) position
        {
            NSString *resultat = @"";
            switch (position) {
                case 0:
                    resultat = @"Test 1";
                    break;
                case 1:
                    resultat = @"Test 2";
                    break;
                default:
                    break;
            }
            return resultat;
        }
        

        你可以通过

        获得价值
         [self.delegate wheelDidChangeValue:[LabelGestureRecognizer getName:0]];
        

        有关类方法的更多信息,您可以点击此链接Writing Objective-C Class Methods

        【讨论】:

        • [self.delegate wheelDidChangeValue:[LabelGestureRecognizer getName:0]];我收到一条错误消息:“没有已知的选择器 -getName 的类方法”
        • 您是否将类方法符号从 - 更改为 + ?并在您的班级中导入 LabelGestureRecognizer
        • 更新你的接口 (.h) 文件 + (NSString *) getName:(int) position;
        • @abhishekkharwar,+1。不错的建议,即使它与问题无关。也可以使用类名。
        • 感谢@ACB 的支持 :)
        【解决方案5】:

        只需创建该方法所在类的对象,最后使用该对象调用该方法。非常简单...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-22
          • 1970-01-01
          • 2023-03-08
          • 2013-09-19
          • 1970-01-01
          • 2012-02-08
          相关资源
          最近更新 更多