我正在使用UICollectionView
并且在复制我在UITableView
中工作的某些内容时遇到了一些困难。我希望设置selectedBackgroundView
selected
单元格的UICollectionView
,并在每次加载视图时都保留该选择。
我的基本应用程序在Tab Bar controller
中有两个标签,其中两个标签均为UITableViewControllers
。第二个选项卡是应用程序内设置,我有两个cells
;一个用于App主题,一个用于键盘主题。键盘主题是另一个Table View
,但App Themes
是UICollectionView
,网格为3x4单元格。虽然这是动态创建的,但不会有更多的单元格,这就是它。
工作
现在,我可以选择UICollectionViewCell
并愉快地在顶部应用自定义图片;这非常有效。
问题
我面临的问题是,即使值保存在NSUserDefaults
中,当视图重新加载时,所选单元格也不会在顶部维护该自定义图像。
因为我使用我的键盘主题(UITableView
)有相同的概念,所以我在这里复制了这些原则,但我不确定我所做的是否真的是正确的。
以下是一些代码:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
ThemeCell *themeCell = (ThemeCell *)[self.cView cellForItemAtIndexPath:indexPath];
self.selectedThemeString = themeCell.cellLabel.text;
if(self.checkedIndexPath)
{
UICollectionViewCell *uncheckCell = [self.cView cellForItemAtIndexPath:self.checkedIndexPath];
uncheckCell.selectedBackgroundView = nil;
}
themeCell.selectedBackgroundView = dot;
[themeCell addSubview:dot];
self.checkedIndexPath = indexPath;
UIImageView *dot = [[UIImageView alloc]initWithFrame:CGRectMake(5, 0, 1, 2)];
dot.image=[UIImage imageNamed:@"check-white-hi.png"];
themeCell.selectedBackgroundView = dot;
[themeCell addSubview:dot];
[[NSUserDefaults standardUserDefaults] setObject:self.selectedThemeString forKey:@"Selection"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
在cellForItemAtIndexPath
中,我有:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
ThemeCell *themeCell = (ThemeCell *)[collectionView dequeueReusableCellWithReuseIdentifier:@"Theme Cell" forIndexPath:indexPath];
NSString *cellData = [self.themeLabels objectAtIndex:indexPath.row];
themeCell.cellLabel.text = cellData;
themeCell.cellImages.image = self.themeImages[indexPath.row];
UIImageView *dot = [[UIImageView alloc]initWithFrame:CGRectMake(5, 0, 1, 2)];
dot.image=[UIImage imageNamed:@"check-white-hi.png"];
self.selectedThemeString = [[NSUserDefaults standardUserDefaults] objectForKey:@"Selection"];
NSLog(@"Selected Theme String = %@", self.selectedThemeString);
if (!self.selectedThemeString)
{
NSLog(@"111");
self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
themeCell.selectedBackgroundView = dot;
[themeCell addSubview:dot];
}
if ([self.selectedThemeString isEqualToString:@"Original"])
{
NSLog(@"222");
self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
themeCell.selectedBackgroundView = dot;
[themeCell addSubview:dot];
}
if ([self.selectedThemeString isEqualToString:@"Mystical"])
{
NSLog(@"333");
self.checkedIndexPath = [NSIndexPath indexPathForRow:2 inSection:0];
themeCell.selectedBackgroundView = dot;
[themeCell addSubview:dot];
}
return themeCell;
我的viewWillAppear
有:
self.selectedThemeString = [[NSUserDefaults standardUserDefaults] objectForKey:@"Selection"];
if ([self.selectedThemeString isEqualToString:@"Original"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Peacock"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:1 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Mystical"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:2 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Zebra"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:3 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Simplicity"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:4 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Rainbow"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:5 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Prosperity"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:6 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Leopard"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:7 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Hypnotic"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:8 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Dunes"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:9 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Twirl"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:10 inSection:0];
}
else if ([self.selectedThemeString isEqualToString:@"Oceanic"])
{
self.checkedIndexPath = [NSIndexPath indexPathForRow:11 inSection:0];
}
[self.cView reloadData];
上面定义了单元格的顺序,因此第一行第一个单元格称为Original。第二个单元格第一行称为Peacock,第三个单元格第一行称为Mystical等。
我的想法是,我可以为每个字符串定义indexPathForRow
,在cellForItemAtIndexPath
中,当字符串命中时,它会将selectedBackgroundView
应用于图像。
状态
现在发生的事情是,我可以成功选择一个单元格并显示图像;如果我重新加载视图(通过外出并返回),则单元格中的selectedBackgroundView
不存在。但是,我知道NSUserDefaults
正在运行,因为在我的cellForItemAtIndexPath
中,“111”,或“222”或“333”已成功记录,但它只是没有设置所选的突出显示状态UICollectionCell。
我需要的是:
1)重新加载视图时,选定的单元格会显示selectedBackgroundView
图像。
更新:
在cellForItemAtIndexPath
,如果我放themeCell.backgroundView = dot
而不是themeCell.selectedBackgroundView = dot
,当我重新加载视图时,每个单元格都会突出显示自定义图像,而不仅仅是选定的单元格,所以我想我虽然取得了一些进展,但仍然失败了。
任何指导都会非常感激。
答案 0 :(得分:0)
情况避免了。
我已经解决了这个问题。
作为参考,我会在这里为遇到同样问题的人提供固定代码。
在cellForItemAtIndexPath
中,我执行了以下操作:
if (!self.selectedThemeString)
{
NSLog(@"111");
self.checkedIndexPath = [NSIndexPath indexPathForRow:0 inSection:0];
themeCell.backgroundView = dot;
[themeCell addSubview:dot];
}
if([self.checkedIndexPath isEqual:indexPath])
{
NSLog(@"Loaded");
themeCell.backgroundView = dot;
[themeCell addSubview:dot];
}
else
{
NSLog(@"Not Loaded");
themeCell.backgroundView = nil;
}
这与之前的代码类似,但基本上是从检查UITableView
的{{1}}代码中复制的。
另一个变化是我使用了indexPath
属性而不是backgroundView
。
我在整个课程中都做了这个改动,所以无论我在哪里使用selectedBackgroundView,我都将其改为backgroundView。
我很开心,这就像一种享受。