NSMutableArray 中的对象
Posted
技术标签:
【中文标题】NSMutableArray 中的对象【英文标题】:object inside NSMutableArray 【发布时间】:2013-11-12 03:34:10 【问题描述】:我有一个表格视图,其中包含图像列表和图像缩略图(图像列表和缩略图是从 JSON 对象解析的),我正在像这样将图像数据对象添加到 imagesArray -
ImageData *imageDataObject = [[ImageData alloc]initWithImageId:[[imageListArray
objectAtIndex:indexPath.row] imageId] imageData:imageData];
[imagesArray addObject:imageDataObject];
图像数据对象
@property (nonatomic, strong) NSString* imageId;
@property (nonatomic, strong) NSData* imageData;
allImagesArray 像这样
[ImageData object1,ImageData object2,....]
我想根据 selectedImageId 将这个数组中对象的 imageData 分配给
UIImage* image =[[UIImage alloc] initWithData:........];
我想不出基于 selectedImageId 获取该 imageData 的方法
请帮忙。
更新 - 谢谢大家的帮助,我可以的。
【问题讨论】:
您应该使用一个字典并将所有图像添加到其中:imageid:imagedata,imageid2:imagedata2,...
【参考方案1】:
一种可能的方法是遍历数组,从字典中找到您的selectedImageId
并使用它。
例子:
ImageData *imageDataObject = nil;
for(int i=0; i<allImagesArray.count;i++)
NSDictionary *dict= allImagesArray[i];
imageDataObject = [dict objectForKey:selectedImageId];
if(imageDataObject != nil)
UIImage* image =[[UIImage alloc] initWithData:........];
//do whatever
break;
根据您的编辑:
您拥有的是一组 ImageData 对象 [ImageData1,ImageData2,...]。对于每个 ImageData 对象,您都有 imageId
和 imageData
属性,您只需将 selectedImageId
与此 imageId
进行比较,然后从中获取 imageData
。
因此,在您的 PPImageViewController
中,您可以像这样迭代 allImagesArray
并获取 imageData。
for(ImageData* imgDataObj in self.allImagesArray)
if([imgDataObj.imageId isEqualToString:self.selectedImageId])
UIImage* image =[[UIImage alloc] initWithData:imgDataObj.imageData];
【讨论】:
非常抱歉误导了数组有 ImageData 对象,更新了问题【参考方案2】:所以你有:
NSArray* allImagesArray = @[@@"some_image_id_in_NSString_1":@"the data in NSData 1", @@"some_image_id_in_NSString_2":@"the data in NSData 2"];
作为 PPImageViewController 的属性。
假设imageid
是NSString
而imagedata
是NSData
,您可以在PPImageViewController
上创建类似这样的方法:
- (UIImage*) findSelectedImage
UIImage* selectedImage;
for(NSDictionary* d in allImagesArray)
NSString* currentKey = [[d allKeys] objectAtIndex:0];
if([currentKey isEqualToString:[self selectedImageId]])
NSData* imageData = [d objectForKey:currentKey];
selectedImage = [UIImage imageWithData:imageData];
break;
return selectedImage;
然后像这样调用它,也许在你的 viewDidLoad
方法上:
UIImage* selectedImage = [self findSelectedImage];
希望对您有所帮助。
【讨论】:
这是抛出错误 -[ImageData allKeys]: unrecognized selector sent to instance 0x10901cc80 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[ImageData allKeys]:无法识别的选择器发送到实例 0x10901cc80” 我的代码[ImageData allKeys]
在哪里?你的意思是[d allKeys]
?如果是真的,那么 allImagesArray 可能不包含任何 NSDictionary 对象。
非常抱歉误导了数组有 ImageData 对象,更新了问题【参考方案3】:
我看到您正在将 ImageData 对象直接添加到数组中。您可以改用 NSDictionary。键可以是 imageID(假设它是唯一的),值是 imageData 对象。然后将字典而不是数组传递给 PPImageViewController。
NSMutableDictionary *imageData = [NSMutableDictionary dictionary];
ImageData *imageDataObject = [[ImageData alloc]initWithImageId:[[imageListArray
objectAtIndex:indexPath.row] imageId] imageData:imageData];
[imageData setObject:imageDataObject forKey:imageId];
然后在 PPImageViewController 中,您可以轻松地根据选定的 imageID 获取 imageDataObject,如下所示:
ImageData *imageDataObject = allImagesDictionary[selectedImageID];
编辑:
NSArray *imageIndexes = [allImagesDictionary allKeys];
// Now use imageIndexes to populate your table. This will guarantee the order
// Fetch the imageId
selectedImageID = imageIndexes[indexPath.row];
// Fetch the imageData
ImageData *imageDataObject = allImagesDictionary[selectedImageID];
【讨论】:
是的,我做了同样的事情,但进一步我必须实现滑动手势,所以使用 NSArray,因为用户可以从列表中选择任何图像,所以 selectedImageId 可以是任何东西,所以很难知道图像的索引 您可以通过 [imageData allKeys] 获取键数组并使用它来确保索引正确。这将确保从正确的位置拾取对象,并且当发生滑动手势时,返回的索引可以直接用于首先从 [imageData allKeys] 获取对象,并且该索引可用于获取 imageData。以上是关于NSMutableArray 中的对象的主要内容,如果未能解决你的问题,请参考以下文章
访问另一个 NSMutableArray 中的对象的 NSMutableArray(即嵌套对象访问)
如何将 NSArray 中的对象添加到 NSMutableArray 的末尾?