【问题标题】:Values in NSMutableArray seem to spontaneously change. How can this be?NSMutableArray 中的值似乎会自发改变。怎么会这样?
【发布时间】:2014-08-25 06:21:05
【问题描述】:

我从NSMutableArrayrainbowArrayUICollectionView 的单元格提供背景颜色,使用very elegant code from BJ Homer 填充UIColors

float INCREMENT = 0.04;

for (float hue = 0.0; hue < 1.0; hue += INCREMENT)
{
    UIColor *color = [UIColor colorWithHue:hue
                                saturation:1.0
                                brightness:1.0
                                     alpha:1.0];
    [rainbowArray addObject:color];
    NSLog(@"color in rainbow is %@",color);
}

效果很好! NSLog'doutput 证明颜色在那里。然而,当我实际将颜色应用到我的UICollectionViewCells 时,NSLogs 表明颜色已经以某种方式变回colorWithHue 的值1 0 0 1

这是来自我的 cellForItemAtIndexPath 的代码,因为我在两个 CV 之间共享我的委托方法而进行了简化:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{

    if (collectionView == self.usedColorsCollectionView)
    {
       ...        
    }


    else if (collectionView == self.pickerCollectionView)
    {
        static NSString *cellIdentifier = @"pickerCell";

        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];


        for (UIColor *thisColor in rainbowArray)
        {
            NSLog(@"Somehow color has changed to %@, and is being applied to cell",thisColor);

            [cell setBackgroundColor:thisColor];

            [cell.layer setCornerRadius:18.0f];
            [cell setUserInteractionEnabled:YES];

            return cell;
        }
    }
    return 0;
}

这里是日志,也是简化的,首先是它们被创建并插入数组时的值:

2014-08-24 22:38:24.936 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 1 0 0 1
2014-08-24 22:38:24.937 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 1 0.24 0 1
2014-08-24 22:38:24.938 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 1 0.48 0 1
2014-08-24 22:38:24.939 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 1 0.72 0 1
2014-08-24 22:38:24.940 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 1 0.96 0 1
2014-08-24 22:38:24.940 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 0.8 1 0 1
2014-08-24 22:38:24.941 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 0.56 1 0 1
2014-08-24 22:38:24.941 WMDGx[26662:90b] color in rainbow is UIDeviceRGBColorSpace 0.32 1 0 1

...

以下是应用于单元格时的值:

2014-08-24 22:38:24.959 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.960 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.961 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.961 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.962 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.963 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.964 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.964 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.965 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.965 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell
2014-08-24 22:38:24.966 WMDGx[26662:90b] Somehow color has changed to UIDeviceRGBColorSpace 1 0 0 1, and is being applied to cell

这是结果的截图:

有问题的单元格是大红色的,应该是多色的。

我已经尝试了好几个小时来解决这个问题。有什么想法吗?

编辑:

全部修复!我使用了@Paulw11 提供的代码,但也要感谢@Shan 和@Ramshad 提供的一些语法,因为我不熟悉它。

现在是这样的:

在我添加此代码 (posted by @neilsbot in this answer) 以充实颜色数组后,现在包含 68 个颜色孔。

float INCREMENT = 0.06;

for (float hue = 0.0; hue < 1.0; hue += INCREMENT)
{
    UIColor *color = [UIColor colorWithHue:hue
                                saturation:1.0
                                brightness:1.0
                                     alpha:1.0];

    CGFloat oldHue, saturation, brightness, alpha ;

    BOOL gotHue = [color getHue:&oldHue saturation:&saturation brightness:&brightness alpha:&alpha ];

    if (gotHue)
    {
        UIColor * newColor = [ UIColor colorWithHue:hue saturation:0.7 brightness:brightness alpha:alpha ];
        UIColor * newerColor = [ UIColor colorWithHue:hue saturation:0.5 brightness:brightness alpha:alpha ];
        UIColor * newestColor = [ UIColor colorWithHue:hue saturation:0.3 brightness:brightness alpha:alpha ];

        [rainbowArray addObject:color];
        [rainbowArray addObject:newColor];
        [rainbowArray addObject:newerColor];
        [rainbowArray addObject:newestColor];
    }
}

【问题讨论】:

  • 用这个代替循环[cell setBackgroundColor:[rainbowArray objectAtIndex:indexPath.row % rainbowArray.count]];

标签: ios iphone nsmutablearray uicollectionview uicolor


【解决方案1】:

您的 for 循环中有一个 return,因此您始终返回数组中的第一个元素,即 1 0 0 1

你想要的是

else if (collectionView == self.pickerCollectionView) {
        static NSString *cellIdentifier = @"pickerCell";

        UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

        [cell setBackgroundColor:[rainbowArray objectAtIndex:indexPath.item]];

        [cell.layer setCornerRadius:18.0f];
        [cell setUserInteractionEnabled:YES];

         return cell;
 }

【讨论】:

    【解决方案2】:

    cellForItemAtIndexPath 将为每个单元格触发。所以只需使用indexPath.row % rainbowArray.count 作为数组索引来获取颜色。还要确保从循环中删除 return 语句。

    修改你的cellForItemAtIndexPath

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        if (collectionView == self.usedColorsCollectionView)
        {
           ...        
        }
        else if (collectionView == self.pickerCollectionView)
        {
            static NSString *cellIdentifier = @"pickerCell";
    
            UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    
            UIColor *thisColor = [rainbowArray objectAtIndex:(indexPath.row % rainbowArray.count)]; //this will repeat the colors from begning if they end.
    
            [cell setBackgroundColor:thisColor];
            [cell.layer setCornerRadius:18.0f];
            [cell setUserInteractionEnabled:YES];
        }
    
       return cell;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-15
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多