当我使用此代码从名为“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。
我没有正确编写动态密钥生成器吗?
答案 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"];
thisRecordingsStats
字典中查找该字符串的对象,从而获得另一个字典,用于初始化stats
变量。stats
词典中查找“持续时间”键的对象,并将durationLabel
的{{1}}设置为此对象。或者这个:
text
添加NSDictionary *stats = [thisRecordingsStats objectForKey:@"%@",[[[self.fileList objectAtIndex:[indexPath row]] lastPathComponent] stringByDeletingPathExtension]];
部分没有意义,因为@"%@",
没有采用格式字符串。将the documentation for NSString's stringWithFormat:
method与the documentation for NSDictionary's objectForKey:
method进行比较。
代码“有效”,因为您作为objectForKey:
的参数传递的是逗号表达式。 C的逗号运算符评估双方并评估右侧。但是,在这种情况下,与大多数其他情况一样,它什出于这样的原因,逗号运算符很少使用,甚至更少用于故意。
将objectForKey:
部分剪掉。
回到问题:
两个版本都没有错误,日志显示我的数据在那里:但我得到一个空白的UILabel。
嗯,你说你在@"%@",
数组中的字符串生成的密钥出现在UILabel中,所以问题就是其中之一:
fileList
是thisRecordingStats
。nil
不包含您从thisRecordingStats
中的字符串生成的密钥的对象。self.fileList
确实包含您从thisRecordingStats
中的字符串生成的密钥的对象,它是一个字典,但它不包含密钥“duration”的值。self.fileList
确实包含您从thisRecordingStats
中的字符串生成的密钥的对象,它是一个字典,它包含密钥“duration”的值,但该值是空(零长度)字符串。您还应该检查调试器控制台以查找其他问题的消息。例如,“不响应选择器”消息可能是因为self.fileList
包含您从thisRecordingStats
中的字符串生成的密钥的对象,但它不是字典。
最后,我建议构建一个或多个model object类,而不是像这样嵌套字典。它往往使代码更容易阅读和调试。特别是,表面上具有关键“持续时间”对象的字典应该是模型对象。