【问题标题】:Baffled at trying to set cell.image using UIImage: imageNamed:对尝试使用 UIImage 设置 cell.image 感到困惑:imageNamed:
【发布时间】:2009-06-02 04:59:36
【问题描述】:

我创建了一个包含 NSDictionary 结构的 plist。键是一个标签(我用来填充 tableview cell.text),值是我想用来“动态”填充 cell.image 的文件名。将准确的 png 文件名加载到项目中。

为了让事情变得更简单(我想),我将 plist 加载到一个 NSDictionary 中,然后将它分成两个数组(使用 allKeys 和 allValues)。

在尝试设置单元格图像时,我不明白为什么会这样:

cell.image = [UIImage imageNamed:@"bad.png"];

这不会(在模拟器中 - 我在调试器中遇到应用程序崩溃和呕吐):

cell.image = [UIImage imageNamed:[rowImageList objectAtIndex:indexPath.row]];

我可以将下一行放在第二段代码之前,它工作得很好,所以看起来我从 objectAtIndex 获得了一个 NSString:

NSLog(@"Image name: %@", [rowImageList objectAtIndex:indexPath.row]);

我也尝试过创建一个临时 NSString 并将 [rowImageList objectAtIndex:] 分配给它,然后使用该 NSString 来提供 imageNamed:。

这是来自调试器的一些信息:

-[NSCFArray 长度]:无法识别的选择器发送到实例 0x262d910

由于未捕获而终止应用 例外 'NSInvalidArgumentException',原因: '*** -[NSCFArray 长度]: 无法识别 选择器发送到实例 0x262d910'

如果您需要更多信息/代码,请告诉我。

编辑:这是我填充 rowImageList 的方式:

NSArray *myRowImages = [[NSArray alloc] init]; 
myRowImages = [searchFilterList allValues]; 
self.rowImageList = [myRowImages copy]; 
[myRowImages release]; 
//where searchFilterList is an NSDictionary that I loaded from a plist

这是我的 plist 的屏幕截图: [IMG][]1 [/IMG]

编辑:修改 rowImageList 人口:

 NSMutableArray *myRowImages = [[NSMutableArray alloc] init];
 NSEnumerator *enumerator = [searchFilterList objectEnumerator];
 id object;

 while ((object = [enumerator nextObject])) {
     [myRowImages addObject:[object objectAtIndex:0]];
 }
 self.rowImageList = myRowImages; //edit: added self. prefix
 [myRowImages release];

【问题讨论】:

  • 嗯...我得重新检查一下。 rowImageList 是一个数组,但我假设我正在将 NSStrings “推”到数组上(即 NSString 对象数组)。这是我填充 rowImageList 的方式: NSArray *myRowImages = [[NSArray alloc] init]; myRowImages = [searchFilterList allValues]; self.rowImageList = [myRowImages 副本]; [myRowImages 发布]; - 其中 searchFilterList 是我从 plist 加载的 NSDictionary。
  • 天哪,格式不太好。
  • 如果你跟着我,我最终改变了“rowImageList = myRowImages;”到“self.rowImageList = myRowImages;”稍后在代码中尝试使用 rowImageList 时发生了奇怪的废话。
  • 我认为“奇怪的废话”包括崩溃?如果不使用访问器,您就会过度释放对象。新的分配是正确的。
  • 是的,我相信我崩溃了。 “奇怪的行为”是在 cellForRowAtIndex 内,数组是“未定义的”。一旦我添加了自我。前缀,presto,不再未定义。

标签: iphone uiimage


【解决方案1】:

我会仔细检查 NSLog() 的输出,并确保它不是包含 NSString 的数组。这就是错误告诉你的;您正在传递一个 NSArray ,其中需要一个 NSString 。

【讨论】:

  • 是的,你们是对的。我得到的是一个数组而不是一个字符串。我将发布一个新的(但可能仍然不太正确)版本的数组加载。
【解决方案2】:

此错误意味着 [rowImageList objectAtIndex:indexPath.row] 正在返回一个数组而不是预期的字符串。

之所以要打印一个值,是因为要打印一个数组,还需要在 NSLog 语句中指定 %@。

尝试调试方法并检查[rowImageList objectAtIndex:indexPath.row]的类。它很可能会变成一个数组。

【讨论】:

    【解决方案3】:

    您确定您的 plist 是键/字符串对,并且您没有以某种方式将名称包装在数组中吗?

    【讨论】:

    • 我发现自己现在还不确定。 plist 结构是 Dictionary (root) > Array (child) > String (child of array),有 4 对 Array/String。我试图复制另一个 plist 示例。我的假设是我正在创建一个 NSDictionary 结构,其中 Array 是键,String 是值。不知道这个解释有多清楚。
    • 您误解了您的 plist。 plist 中的键是字符串“All Items”、“Good Items”等。值是数组。字符串属于数组。您应该添加 NSLog(@"%@", searchFilterList) 并查看您是否可以理解您的数据结构。你是如何加载这个 plist 的?
    • 从数组的结构方式来看,您希望使用: cell.image = [UIImage imageNamed:[[rowImageList objectAtIndex:indexPath.row] objectAtIndex:0]];当你在 Dictionary 上使用 allValues 时,你会得到一个包含四个数组的数组——每个数组都包含一个字符串。 NSlog 会打印数组内容,所以看起来不错,但您的图像将是 nil。
    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多