如何从 NSDictionary 获取图像到 UICollectionView iOS?
How to fetch images from NSDictionary to UICollectionView iOS?
我有一本只有很少图像的字典。它的结构如下。
NSDictionary
|__ bed
| |__ 351.jpg
| |__ 352.jpg
|__ pillow
| |__ pillow1.png
|__ pillow2.png
我尝试将其添加到 colloectioview
中,如下所示。
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return self.imagesDictionary.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [[[self.imagesDictionary allValues] objectAtIndex:section] count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Setup cell identifier
static NSString *cellIdentifier = @"ImageCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
UIImage *image = (UIImage*)[[(NSArray*)[self.imagesDictionary allValues] objectAtIndex:indexPath.row] objectAtIndex:indexPath.row];
recipeImageView.image = image;
[cell addSubview:recipeImageView];
// Return the cell
return cell;
}
当我 运行 这段代码时,我得到了 2 个部分,所有部分都有相同的图像(第 1 部分 - 351.jpg、pillow2.jpg、第 2 部分 - 351.jpg、pillow2.jpg).我该如何解决这个问题。
提前致谢!
这里的问题可能源于 NSDictionary 不是有序容器这一事实。如果你想通过索引从中挑选项目,你需要在索引到它们之前对键进行排序。尝试这样的事情:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return self.imagesDictionary.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
NSArray* sortedSections = [[self.imagesDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSString* key = sortedSections[section];
NSArray* images = self.imagesDictionary[key];
return images.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Setup cell identifier
static NSString *cellIdentifier = @"ImageCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
NSArray* sortedSections = [[self.imagesDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSString* key = sortedSections[[indexPath indexAtPosition: 0]];
NSArray* images = self.imagesDictionary[key];
UIImage *image = (UIImage*) images[[indexPath indexAtPosition: 1]];
recipeImageView.image = image;
[cell addSubview:recipeImageView];
// Return the cell
return cell;
}
在这种情况下,我不建议您将项目存储在 NSDictionary 上,因为您需要搜索具有索引(例如 0)而不是键(例如床)的部分。因此我建议使用有序集合(NSArray)。
检查此主题:
Apple Documentation
你的主要问题,似乎是这行代码:
UIImage *image = (UIImage*)[[(NSArray*)[self.imagesDictionary allValues] objectAtIndex:indexPath.row] objectAtIndex:indexPath.row];
因为
- 方法 allValues 不会 return 定义顺序中的元素
- 您正在使用 indexPath.row 而不是 indexPath.section。
我有一本只有很少图像的字典。它的结构如下。
NSDictionary
|__ bed
| |__ 351.jpg
| |__ 352.jpg
|__ pillow
| |__ pillow1.png
|__ pillow2.png
我尝试将其添加到 colloectioview
中,如下所示。
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return self.imagesDictionary.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return [[[self.imagesDictionary allValues] objectAtIndex:section] count];
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Setup cell identifier
static NSString *cellIdentifier = @"ImageCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
UIImage *image = (UIImage*)[[(NSArray*)[self.imagesDictionary allValues] objectAtIndex:indexPath.row] objectAtIndex:indexPath.row];
recipeImageView.image = image;
[cell addSubview:recipeImageView];
// Return the cell
return cell;
}
当我 运行 这段代码时,我得到了 2 个部分,所有部分都有相同的图像(第 1 部分 - 351.jpg、pillow2.jpg、第 2 部分 - 351.jpg、pillow2.jpg).我该如何解决这个问题。
提前致谢!
这里的问题可能源于 NSDictionary 不是有序容器这一事实。如果你想通过索引从中挑选项目,你需要在索引到它们之前对键进行排序。尝试这样的事情:
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return self.imagesDictionary.count;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
NSArray* sortedSections = [[self.imagesDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSString* key = sortedSections[section];
NSArray* images = self.imagesDictionary[key];
return images.count;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
// Setup cell identifier
static NSString *cellIdentifier = @"ImageCell";
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
UIImageView *recipeImageView = (UIImageView *)[cell viewWithTag:100];
NSArray* sortedSections = [[self.imagesDictionary allKeys] sortedArrayUsingSelector: @selector(compare:)];
NSString* key = sortedSections[[indexPath indexAtPosition: 0]];
NSArray* images = self.imagesDictionary[key];
UIImage *image = (UIImage*) images[[indexPath indexAtPosition: 1]];
recipeImageView.image = image;
[cell addSubview:recipeImageView];
// Return the cell
return cell;
}
在这种情况下,我不建议您将项目存储在 NSDictionary 上,因为您需要搜索具有索引(例如 0)而不是键(例如床)的部分。因此我建议使用有序集合(NSArray)。 检查此主题: Apple Documentation
你的主要问题,似乎是这行代码:
UIImage *image = (UIImage*)[[(NSArray*)[self.imagesDictionary allValues] objectAtIndex:indexPath.row] objectAtIndex:indexPath.row];
因为
- 方法 allValues 不会 return 定义顺序中的元素
- 您正在使用 indexPath.row 而不是 indexPath.section。