【问题标题】:Cannot append to NSString无法附加到 NSString
【发布时间】:2012-11-20 02:44:14
【问题描述】:

我正在尝试将文件扩展名附加到子类 NSTextFieldCell 返回的 stringValue

我已经尝试了所有我知道的并且可以在互联网上找到的东西,但这只是让我头疼

方法如下:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {

    NSMutableString *filename = [[NSMutableString alloc] init];
    [filename appendString:self.stringValue];

    NSString *iconFileName = [[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:filename] stringByAppendingPathExtension:@"png"];
    NSLog(@"%@", iconFileName);

}

返回的值是没有扩展名的! 我还尝试了以下方法:

filename = [NSString stringWithFormat: @"%@.png", filename];

这将返回不带“.png”的“文件名”字符串

同样:

filename = [filename stringByAppendingString: @".png"];

只返回“文件名”

这个单元格所属的表格列绑定了一个NSObject,向该列发送数据的方法如下:

- (NSString *) nationString {
    NSMutableString *string = [[NSMutableString alloc] init];
    int index = 0;

    if (nationAddress && nationAddress > 0x0) {
        index = [[[[controller database] nationsAddressIndex] valueForKey:[NSString stringWithFormat:@"%lli", nationAddress]] intValue];
        Nation *nationality = [[[controller database] nations] objectAtIndex:index];
        [string appendString:[nationality name]];
    }
    else {
        [string appendString:@"---"];
    }

    return string;
}

有人知道为什么会发生这种情况,或者可以提出任何替代方案吗? 任何帮助将不胜感激 谢谢

【问题讨论】:

  • 如果文件名是 NSString,filename = [NSString stringWithFormat: @"%@.png", filename]; 应该可以工作。您似乎已将其声明为 NSMutableString,这可能会导致编译问题,但仍应执行正常。我怀疑你没有以某种方式正确显示你的价值观。
  • 谢谢,我尝试过使用 NSString 和 NSMutableString,两者的行为相同。文件名是 NSMutableString,如第一段代码所示,它来自 NSString 类型的 self.stringValue 的值,来自子类 NSTextFieldCell。我正在查看 XCode 调试器中的值,并将它们也转储到 NSLog 中。我在filename = [NSString stringWithFormat: @"%@.png", filename]; 之后得到的值不包括“.png”部分,因此我的其余代码不起作用,因为它找不到文件,因为它缺少扩展名
  • 使用 NSLog 转储字符串。调试器经常撒谎。
  • “我正在查看 XCode 调试器中的值,并将它们也转储到 NSLog”
  • 使用“文件名”以外的变量名——我怀疑你有 #defined 之类的。

标签: objective-c cocoa nsstring nsmutablestring


【解决方案1】:

这应该返回带有扩展名的完整路径:

NSString *path =  [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Default.png"];
NSLog(@"%@", path);

因此,假设 self.stringValue 包含扩展名,您的方法应该使用:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {    
    NSString *iconFileName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:self.stringValue];
    NSLog(@"%@", iconFileName);
}

如果它不包含扩展,试试这个:

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    NSString *strWithPath = [NSString stringWithFormat:@"%@.png", self.stringValue];
    NSString *iconFileName = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:strWithPath];
    NSLog(@"%@", iconFileName);
}

【讨论】:

  • 感谢您的回答。 self.stringValue 不包含扩展名,使用您的最后一个代码块仍然没有附加“.png”扩展名。我通常认为 NSLog 出于某种原因没有正确显示该值,因为它没有意义,但即使在尝试之后:if ([[NSFileManager defaultManager] fileExistsAtPath:iconFileName]) { } 它也不起作用。仅仅是因为 iconFileName 仍然缺少扩展名(文件肯定在那里!)
  • 显示@property 的stringValue 声明(以及实例变量/@synthesize,如果那里也有的话)。
  • stringValue 没有@property 声明,我不会覆盖它。 stringValueNSTextFieldCell 定义
【解决方案2】:

只是为了测试。尝试使用此代码并在此处更新输出值:

NSMutableString *filename = [[NSMutableString alloc] init];
[filename appendString:self.stringValue];
NSLog(@"text1: %@ ;", filename);

filename = [NSString stringWithFormat: @"%@.png", filename];
filename = [NSString stringWithFormat: @"%@.png%@", filename, filename];
NSLog(@"text2: %@ ;", filename);

【讨论】:

  • 这是 NSLog 的输出:text1: Braziltext2: Brazil
  • 我添加了临时更改。现在输出是什么?
【解决方案3】:

这些应该可以工作(除非有错别字):

NSString* filename = @"abc";

NSString* result1 = [NSString stringWithFormat:@"%@.png", filename];

NSString* result2 = [filename stringByAppendingString:@".png"];

NSMutableString* result3 = [filename mutableCopy];
[result3 appendString:@".png"];

如果它们似乎不起作用,那么您在初始化或显示值的方式上存在问题。

提示:在上述每一项之后立即放置一个NSLog(@"The answer is %@", resultN); 语句(适当更改“resultN”),看看你得到了什么。请记住,如果您从不同的对象看,您可能会看到不同的变量。

【讨论】:

  • 如果我自己用字符串初始化文件名​​变量,它确实有效。但是,当我在第一篇文章中使用 self.stringValue 的值对其进行初始化时,它不起作用。 self.stringValue 是一个 NSString,它为我提供了子类化的 tableview 单元格中的文本。我确实在每一行之后都尝试过 NSLog,.png 扩展名从未附加到文件名!
  • @ThanosSiopoudis -- 你仍然没有意义。你试过 NSLogging 你从 self.stringValue 得到的初始值吗?
  • self.stringValue 的类型为 __NSCFString,内容为 @"Brazil"。
猜你喜欢
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多