从数组生成objectForKey

时间:2010-04-25 20:45:57

标签: cocoa uilabel nsdictionary

当我使用此代码从名为“fileList”的文件名数组中获取字符串时,我取得了成功:

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension];

所以我期望相同的代码为我生成相同的字符串作为一个键:

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]];
  cell.durationLabel.text = [stats objectForKey:@"duration"];

或者这个:

NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]];

两次构建都没有错误,日志显示我的数据在那里:但我得到一个空白的UILabel。
     我没有正确编写动态密钥生成器吗?

1 个答案:

答案 0 :(得分:2)

  

当我使用此代码从名为“fileList”的文件名数组中获取字符串时,我取得了成功:

cell.timeBeganLabel.text = [[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension];

那么,该消息表达式的结果是你的关键,对吗?

也就是说,字典中的键是没有扩展名的文件名?

  

所以我期望相同的代码为我生成相同的字符串作为一个键:

NSDictionary *stats = [thisRecordingsStats objectForKey:[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]];
cell.durationLabel.text = [stats objectForKey:@"duration"];
  1. 您像以前一样计算没有扩展名的文件名。
  2. 您在thisRecordingsStats字典中查找该字符串的对象,从而获得另一个字典,用于初始化stats变量。
  3. 您在stats词典中查找“持续时间”键的对象,并将durationLabel的{​​{1}}设置为此对象。
  4.   

    或者这个:

    text

    添加NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]]; 部分没有意义,因为@"%@",没有采用格式字符串。将the documentation for NSString's stringWithFormat: methodthe documentation for NSDictionary's objectForKey: method进行比较。

    代码“有效”,因为您作为objectForKey:的参数传递的是逗号表达式。 C的逗号运算符评估双方并评估右侧。但是,在这种情况下,与大多数其他情况一样,它什出于这样的原因,逗号运算符很少使用,甚至更少用于故意。

    objectForKey:部分剪掉。

    回到问题:

      

    两个版本都没有错误,日志显示我的数据在那里:但我得到一个空白的UILabel。

    嗯,你说你在@"%@",数组中的字符串生成的密钥出现在UILabel中,所以问题就是其中之一:

    • fileListthisRecordingStats
    • nil不包含您从thisRecordingStats中的字符串生成的密钥的对象。
    • self.fileList确实包含您从thisRecordingStats中的字符串生成的密钥的对象,它是一个字典,但它不包含密钥“duration”的值。
    • self.fileList确实包含您从thisRecordingStats中的字符串生成的密钥的对象,它是一个字典,它包含密钥“duration”的值,但该值是空(零长度)字符串。

    您还应该检查调试器控制台以查找其他问题的消息。例如,“不响应选择器”消息可能是因为self.fileList包含您从thisRecordingStats中的字符串生成的密钥的对象,但它不是字典。

    最后,我建议构建一个或多个model object类,而不是像这样嵌套字典。它往往使代码更容易阅读和调试。特别是,表面上具有关键“持续时间”对象的字典应该是模型对象。