NSFormatter问题:没有调用空字符串

时间:2011-01-04 00:48:35

标签: cocoa

我为我的(只读)表列创建了一个自定义格式化程序。它看起来像这样:

- (NSString *)stringForObjectValue:(id)anObject
{ 
  NSAssert([anObject isKindOfClass:[NSString class]] && anObject != nil,
            @"invalid object");

  if ([anObject isEqualToString:@""])
    return @"EMPTY";
  else
    return [anObject stringByAppendingString:@"++"];
}

很简单。相应的对象只是字符串,因此它是一个字符串到字符串的格式化程序。返回所有非空字符串对象,并附加@"++"。应将空字符串对象转换为@"EMPTY"字符串。

@"++"很好地附加到非空字符串。

问题是,@"EMPTY"永远不会出现!当底层对象是空字符串时,Cocoa从不调用我的格式化程序。相应的行只是保持为空,而不是显示我请求的@"EMPTY"

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我已经尝试过你的代码了。它对我有用。这是代码(稍加修改):

非空字符串:

#import "untitled.h"


@implementation untitled

-(void) theMain
{
    NSLog(@"str: %@", [self callMe]);

}


-(NSString *)callMe
{
    NSString *anObject = [[NSString alloc] initWithString:@"s"];

    if ([anObject isEqualToString:@""])
        return @"EMPTY";
    else
        return [anObject stringByAppendingString:@"++"];

}
@end

<强>结果:

2011-01-04 09:23:10.991 string[410:80f] str: s++

现在尝试空字符串:

#import "untitled.h"


@implementation untitled

-(void) theMain
{
    NSLog(@"str: %@", [self callMe]);

}


-(NSString *)callMe
{
    NSString *anObject = [[NSString alloc] initWithString:@""];

    if ([anObject isEqualToString:@""])
        return @"EMPTY";
    else
        return [anObject stringByAppendingString:@"++"];

}
@end

结果:

2011-01-04 09:25:42.379 string[441:80f] str: EMPTY

所以你的代码确实有效。也许你可以向我们展示你的代码的其他部分(或许也可以调用你的函数),所以我们可以真正发现问题。您发布的代码确实有效。

答案 1 :(得分:0)

我不确定,但你可能会遇到nil vs null;除非你完全确定它是一个空字符串而不是null,你可以测试类似的东西:

[anObject isEqual: [NSNull null]]

然而,使用if ([anObject length]==0)可能更简单,因为除了是一个包含多个字符的字符串之外,它应该可以捕获任何情况,如果这是你的愿望。