帮助对作为 URL 图像的 NSMutableDictionary 字符串进行排序
Posted
技术标签:
【中文标题】帮助对作为 URL 图像的 NSMutableDictionary 字符串进行排序【英文标题】:help on sorting NSMutableDictionary strings that are URL images 【发布时间】:2011-05-10 07:47:06 【问题描述】:我想用 xml 列表中的 title 和 imageurl 填充 tablecell。 我设法将标题 (NSMutableDictonary *sections ) 和 imageURL (NSMutableDictonary *sectionsImg) 分别存储到 2 个 NSMutableDictionary 中。
/*******This is in viewDidLoad***/
Directory *allDirectory = [appDelegate.directories objectAtIndex:0];
for (allDirectory in appDelegate.directories)
NSDictionary *dica = [NSDictionary dictionaryWithObject:allDirectory.dirTitle forKey:@"dirTitle"];
NSDictionary *dico = [NSDictionary dictionaryWithObject:allDirectory.imageURL forKey:@"imageURL"];
[dirName addObject:dica];
[dirImage addObject:dico];
//NSLog(@"dic of items : %@",dirImage);
for (allDirectory in appDelegate.directories)
//retrieve the first letter from every directory title (dirTitle)
NSString * c = [allDirectory.dirTitle substringToIndex:3];
NSString * m = allDirectory.imageURL;
found = NO;
find = NO;
for (NSString *str in [self.sections allKeys])
if ([str isEqualToString:c])
found = YES;
for (NSString *stra in [self.sectionsImg allKeys])
if([stra isEqualToString:m])
find = YES;
if (!found)
[self.sections setValue:[[NSMutableArray alloc]init] forKey:c ];
[self.sectionsImg setValue:[[NSMutableArray alloc]init] forKey:m];
if (!find)
[self.sectionsImg setValue:[[NSMutableArray alloc]init] forKey:m];
for (NSDictionary *directory in dirName)
[[self.sections objectForKey:[[directory objectForKey:@"dirTitle"] substringToIndex:3]] addObject:directory];
//NSLog(@"hehehe have : %@",sections);
for (NSDictionary *directoryImg in dirImage)
//[[self.sectionsImg objectForKey:[[directoryImg objectForKey:@"imageURL"] substringFromIndex:0]] addObject:directoryImg];
[[self.sectionsImg objectForKey:[directoryImg objectForKey:@"imageURL"]] addObject:directoryImg];
//NSLog(@"HOHOHO have : %@",sectionsImg);
在 cellForRowAtIndexPath 上我声明了一个字典
NSDictionary *dictionary = [[self.sections valueForKey:[[[self.sections allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
cell.textLabel.text = [dictionary objectForKey:@"dirTitle"];
但是当我尝试为 imageURL 声明字典时
NSDictionary *dictionaryImg = [[self.sectionsImg valueForKey:[[[self.sectionsImg allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)] objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row];
它给了我一个错误: 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]”
知道为什么吗?逻辑应该是相同的,其中可以检索和显示 xml 标题和 url。标题是可检索的,但 imageURL 不是。非常感谢您的帮助!
【问题讨论】:
【参考方案1】:您正在尝试对数组进行排序...除了您的数组不是数组,而是 NSDictionary。
您的代码目前不是最好的。您对字典的理解是错误的,可能会将它们与数组混淆,所以我最好的猜测是您对 Objective-c 编程很陌生。
如果我没记错的话,你有两份清单。第一个列表是名称列表,第二个列表是与该名称对应的图像。
下面我要做两件事:
首先,我提供了两种解决问题的方法。它包含一个示例代码,并为您提供了一个小的解释。存在您不理解我所描述的部分内容的可能性。在这种情况下,您应该; 查看我在下面描述的两个解决方案的链接。它有一个教程,可让您了解有关数组、字典、表格以及 XML 解析的所有内容。所以,在我看来,你可以做两件事:
第一个是使用 NSDictionaries 数组。您将使用如下代码:
NSMutableDictionary *itemOne = [[NSMutableDictionary alloc] init];
NSMutableDictionary *itemTwo = [[NSMutableDictionary alloc] init];
NSMutableArray *listOfAll = [[NSmutableArray alloc] init];
NSString *itemOneName = [[NSString alloc] initWithFormat:@"This is picture 1"];
NSString *itemTwoName = [[NSString alloc] initWithFormat:@"This is picture 2"];
NSData *imageOneData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic1.jpg"]];
NSData *imageTwoData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: @"http://myurl/mypic2.jpg"]];
UIImage *itemOneImage = [UIImage imageWithData: imageOneData];
UIImage *itemTwoImage = [UIImage imageWithData: imageTwoData];
[itemOne setObject:itemOneNameString forKey:@"Name"];
[itemOne setObject:itemOneImage forKey:@"Image"];
[itemTwo setObject:itemTwoNameString forKey:@"Name"];
[itemTwo setObject:itemTwoImage forKey:@"Image"];
[listOfAll addObject:itemOne];
[listOfAll addObject:itemTwo];
可以使用该数组填充任何内容。只需使用带有 for 循环的东西来遍历您的数组。
for (int i = 0; i < [listOfAll count]; i++)
NSMutableDictionary *currentItem = [[NSMutableDictionary alloc] initWithDictionary:[listOfAll objectAtIndex:i]];
//Do something with that current item
您也可以在 tableView 中使用该索引。在这种情况下,您必须使用变量 section
而不是 i
来获得所需的索引。
第二个是使用两个数组。想象一下,你得到一张名为
imageOne
的图像,其文本为imageName
。然后你应该使用:
NSMutableArray *nameList = [[NSMutableArray alloc] init];
[nameList addObject: imageName];
NSMutableArray *imageList = [[NSMutableArray alloc] init];
[imageList addObject: imageOne];
如果您想使用这些列表中的某个项目,您只需使用相同的索引号。 例如:
[theTitleLabel setText:[[NSString alloc] initWithFormat:@"%@", [nameList objectAtIndex:x]]];
[theImageView setImage:[imageList objectAtIndex:x]];
确保 x 是相同的数字。
我知道这是很多信息,尤其是如果您是 Objective - C 的新手。A tutorial exists which gives you a lot of information about how to use arrays, dictionaries and table views. As a bonus, you get to know a little about XML-parsing. 我建议您阅读该教程并做所有事情并阅读它所说的所有内容。这应该会让您在 iPhone 编程世界中有个良好的开端。
祝你好运!
【讨论】:
为了详细说明使用放置在 URL 上的图像,我编辑了答案,以便您也可以找到解释。以上是关于帮助对作为 URL 图像的 NSMutableDictionary 字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking - 向 REST 发送 HTTP POST,发送带有 Base64string 图像的 JSON