随机颜色变化崩溃

时间:2014-05-25 05:49:42

标签: ios objective-c random nsmutablearray

+ (UIColor *)randomColor
{
     static NSMutableArray * __colors;
     if (__colors == nil) {
         __colors = [[NSMutableArray alloc] initWithObjects:[UIColor redColor],
                        [UIColor orangeColor],
                        [UIColor yellowColor],
                        [UIColor blueColor],
                        [UIColor greenColor],
                        [UIColor purpleColor], nil];

     }
     static NSInteger index = 0;

     UIColor *color = __colors[index];
     index = index < 5 ? index + 1 : 0;
     return color;
}

在我的应用程序中,我有一个按钮,调用它来随机更改它的背景颜色。

一旦它循环通过颜色,就会崩溃:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'

有关如何调整代码以解决此问题的任何建议吗?

编辑:

我使用计时器循环显示颜色。如果它有帮助,请点击这里:

- (void)startCountdown
{
    _timer = [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(advanceTimer:) userInfo:nil repeats:YES];
}

- (void)advanceTimer:(NSTimer *)timer
{
    self.button.backgroundColor = [UIColor randomColor];
}

编辑:

以上方法是我现在使用的方法。

到目前为止,它工作得很好,但有一点我想补充一点:

在一个视图中,我可能有多个按钮或图像会有背景改变颜色。

现在我在视图上有3个。其中只有2个正在改变,但没有在所有颜色中循环,这意味着2只能获得3种颜色。

2 个答案:

答案 0 :(得分:2)

一旦颜色耗尽,阵列就为空,索引0超出了数组的值范围。

答案 1 :(得分:0)

如果要循环显示颜色,可以使用static integer作为索引。

+ (UIColor *)randomColor
{

    static NSMutableArray * __colors;
    if (__colors == nil) {
        __colors = [[NSMutableArray alloc] initWithObjects:[UIColor redColor],
                    [UIColor orangeColor],
                    [UIColor yellowColor],
                    [UIColor blueColor],
                    [UIColor greenColor],
                    [UIColor purpleColor], nil];

    }
    static NSInteger index = 0;

    UIColor *color = __colors[index];
    index = index < 5 ? index + 1 : 0;
    return color;
}