在视图重新加载时设置UICollectionViewCell的selectedBackgroundView

时间:2014-04-01 11:06:03

标签: ios iphone uicollectionview nsuserdefaults uicollectionviewcell

我正在使用UICollectionView并且在复制我在UITableView中工作的某些内容时遇到了一些困难。我希望设置selectedBackgroundView selected单元格的UICollectionView,并在每次加载视图时都保留该选择。

我的基本应用程序在Tab Bar controller中有两个标签,其中两个标签均为UITableViewControllers。第二个选项卡是应用程序内设置,我有两个cells;一个用于App主题,一个用于键盘主题。键盘主题是另一个Table View,但App ThemesUICollectionView,网格为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,当我重新加载视图时,每个单元格都会突出显示自定义图像,而不仅仅是选定的单元格,所以我想我虽然取得了一些进展,但仍然失败了。

任何指导都会非常感激。

1 个答案:

答案 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。

我很开心,这就像一种享受。