【问题标题】:How do I call this method in objective-C (iOS)?如何在 Objective-C (iOS) 中调用此方法?
【发布时间】:2011-10-31 00:22:08
【问题描述】:

我已经花了好几个小时试图找到这个问题的答案。我已经尝试过[无论如何我的感受!] 成为一切。而且我无法在我的代码中调用此方法而不会出现此错误:

接收器类型 NSString 例如消息未声明带有选择器 returnAsDoubleDigits: 的方法

我正在尝试重构我的代码,以便我可以重用此方法将单个数字(转换为 NSString)作为两位数字符串返回(即 4 变为 04)。

请问有人可以帮我吗?我什至是否正确声明了它等等?太感谢了! :)

调用类似:

[doubleDigitString returnAsDoubleDigits: singleDigitString];

头文件:

- (NSString *)returnAsDoubleDigits: (NSString *)digits;

实现文件:

- (NSString *)returnAsDoubleDigits: (NSString *)digits {
    if (digits.length == 1) return [NSString stringWithFormat: @"0%@", digits];
    else return [NSString stringWithFormat: @"0%@", digits];
}

【问题讨论】:

  • doubleDigitString 属于哪个类?
  • @Randy 我觉得虽然进行了很好的清理,但有很多风格变化只是个人喜好。
  • @CocoaFu 首先我想让我更容易理解这个问题,但后来我决定让代码更简单一点,不那么混乱。更少的代码 = 更少的潜在错误。但最重要的原因当然是获得我的个人风格。我在任何地方都这样做,甚至在我稍后删除的计算机上的模板代码上(用于试验)。 :-p
  • 如果该方法在您的类别类中并且来自另一个库,您应该谷歌“类别方法在 iOS 中不起作用”,您会发现一些有趣的东西。

标签: objective-c methods call declare


【解决方案1】:

你从哪里调用它?在同一个班?这是你想要的吗?

NSString* doubleDigitString = [self returnAsDoubleDigits:digits];

您也可以随时使用categories

@implementation NSString (mycategory)


-(NSString *) returnAsDoubleDigits
{
   NSString* doubleDigits = nil;
   if (self.length == 1) {
    doubleDigits = [NSString stringWithFormat: @"0%@",
                    self];
   } else {
    doubleDigits = [NSString stringWithFormat: @"0%@",
                      self];
   }
   return doubleDigits;
}
@end

然后使用

 NSString* doubleDigitString = [singleDigitString returnAsDoubleDigits];

【讨论】:

    【解决方案2】:

    问题在于,当您在实际放入的任何类中声明该方法时,您正在调用 NSString 类型的对象上的方法。您可以通过两种方式解决这两个问题:使用 NSString 上的类别,或将您的消息定向到声明您的方法的类型的对象。

    下面是如何做一个分类:

    NSString+doubleDigit.h:

    @interface NSString (doubleDigit)
        -(NSString*)doubleDigit;
    @end
    

    NSString+doubleDigit.m

    @implementation NSString (doubleDigit)
    
    -(NSString*)doubleDigit {
        return [NSString stringWithFormat:@"%02i", [self integerValue]];
    }
    
    @end
    

    然后在您要进行此转换的文件中,#include "NSString+doubleDigit.h" 并简单地写:

    NSString *doubleDigitString = [singleDigitString doubleDigit];
    

    【讨论】:

    • 啊,我想我明白了。也许上下文也会有所帮助? NSDateComponents *timeDifference = [sysCalendar components:unitFlags fromDate:itemLengthDate toDate:hourTargetDate options:0]; 然后我现在分别得到timeDifference minutetimeDifference second。如何在不经历上述所有麻烦的情况下以 mm:ss 格式返回 timeDifference? [这应该是我最初的问题吗?我想知道......!]
    • OO 抱歉,我想我已经看到了解决方案。将输出 double 转换为 int,然后调用您给我的行:NSString *startTimeSecString = [[NSString alloc] initWithFormat:@"%02i", [timeDifference second]]; No ifs, no calls。
    【解决方案3】:

    从您这里的情况来看,您似乎还没有将方法添加到doubleDigitString 所属的类中。查看Objective-C Categories 以添加到现有的类实现中。

    【讨论】:

      【解决方案4】:

      您看错了,您试图在 NSString 类类型上调用该方法,但该方法没有为 NSStrings 声明。

      我假设您已经在自己的类中声明了该方法。如果您在与实现相同的类中使用它,则可以执行以下操作:

      NSString *doubleDigitString = [self returnAsDoubleDigits:singleDigitString];
      

      'self' 指的是你的实现类。要让它像上面显示的那样与 NSStrings 一起工作,您需要使用一个类别,但我不打算深入讨论,因为它会进一步混淆您想要实现的简单事物。

      如果你需要花费数小时才能让这样简单的东西正常工作,我认为你需要在深入研究之前修改 Objective C 的基础知识。

      【讨论】:

      • 请不要让我说小时太字面意思:P 但是人们以不同的方式学习/记住等,有时需要看到适用于他们的东西才能让它点击。
      • 嗯,你确实在你的帖子中使用了这个词,所以人们认为你的意思并不夸张。当然,我们都喜欢看例子并尝试不同的东西,直到我们完全理解,但就像我说的,这是 Objective C 中非常基本的东西
      【解决方案5】:

      从您这里的情况来看,您似乎还没有将方法添加到 doubleDigitString 所属的类中。查看 Objective-C 类别以添加到类的现有实现中。

      【讨论】:

        【解决方案6】:

        您没有正确声明类别。

        NSString *singleDigitString = [doubleDigitString returnAsDoubleDigits];
        NSString+DoubleDigit.h file
        
        @interface NSString (doubleDigit)
        - (NSString*) returnAsDoubleDigits;
        @end
        
        NSString+DoubleDigit.m file
        
        @implementation NSString (doubleDigit)
        
        - (NSString*) returnAsDoubleDigits {
            NSString* doubleDigits = nil;
            if ([self length] == 1) {
                doubleDigits = [NSString stringWithFormat: @"0%@",self];
            } else { 
                doubleDigits = [NSString stringWithFormat: @"%@", self];
            } 
            return doubleDigits; 
        }
        @end
        

        【讨论】:

        • 也许海报没有,但你也没有。如果不作用于实例,实例方法的意义何在?
        猜你喜欢
        • 2015-05-01
        • 2014-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        相关资源
        最近更新 更多