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 对象,您都有 imageIdimageData 属性,您只需将 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 的属性。

假设imageidNSStringimagedataNSData,您可以在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(即嵌套对象访问)

NSMutableArray 中的对象

替换 2d 嵌套 NSMutableArray 内的对象

如何将 NSArray 中的对象添加到 NSMutableArray 的末尾?

使用 NSMutableArray 中的 BOOL 对象来确定单元格状态

从 NSMutableArray 中删除 for 循环中的对象