因为循环不会执行

时间:2014-08-17 18:06:01

标签: ios objective-c for-loop fast-enumeration

以下代码不会循环:

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"Inside method, before for loop");

    NSLog(@"dayBarArray.count = %lu", (unsigned long)dayBarArray.count);

    for (int i = 0; i < dayBarArray.count; i++) //*** I've tried it this way

//    for (DayChartBar *bar in dayBarArray) //*** I've tried it this way
    {
        NSLog(@"Inside for loop");

        DayChartBar *bar = [dayBarArray objectAtIndex:i];

        UIView *thisLabel = [self.scroller viewWithTag:(bar.tag + 100)];

        CGRect visibleRect;
        visibleRect.origin = self.scroller.frame.origin;
        visibleRect.size = self.scroller.bounds.size;

        NSLog(@"bar.frame = %@",NSStringFromCGRect(bar.frame));
        NSLog(@"visibleRect.frame = %@",NSStringFromCGRect(visibleRect));

        if (CGRectIntersectsRect(visibleRect,bar.frame))
        {
            NSLog(@"Inside if statement");

            CGRect intersection = CGRectIntersection(visibleRect,bar.frame);
            NSLog(@"bar.Frame is %@",NSStringFromCGRect(bar.frame));

            thisLabel.center = CGPointMake((thisLabel.center.x), CGRectGetMidY(intersection));
        }

        else
        {
            thisLabel.center = thisLabel.center;
            NSLog(@"Inside else statement");
        }
    }
    NSLog(@"Still inside method, after for loop");

}

以下是策略性地NSLog陈述的结果:

2014-08-17 10:07:37.221 WMDGx[54442:90b] Inside method, before for loop
2014-08-17 10:07:37.222 WMDGx[54442:90b] dayBarArray.count = 0
2014-08-17 10:07:37.223 WMDGx[54442:90b] Still inside method, after for loop

正如您所看到的,我已尝试过传统的for loop和快速枚举。两者都不会执行。正如NSLogs所示,我输入方法,但跳过循环,无论我采取何种方法。

我非常确定我已经编写了良好的代码,因为我已经在同一个应用程序的许多其他地方成功使用了非常相似的语法(两种类型)。是的,我已经查看过几十个关于SO的类似问题,以及咨询关于Objective C for循环的基本文本,但没有解决。

与往常一样,我对我犯了一个愚蠢的错误的可能性持开放态度,但是,如果是这样的话,我就躲过了。 for循环中的代码(我试图重新定位UILabel以响应相关UIView的滚动)可能无关紧要,但我将其包含在内以防万一

所有帮助和意见都表示赞赏!

修改

正如下面所指出的,这个问题的答案是相关的dayBarArray是空的。我刚检查了添加对象的代码,感到很困惑。我当然应该在我的NSLog中看到明显的答案,并且没有任何借口,除了我之前检查过添加代码并且条形似乎被添加。当我理顺那里的错误时,我会回报。

第二次修改:

好吧,这对我来说是一个愚蠢的错误 - 我没有初始化阵列。同样,如果我没有发布问题,并且因为我相信我已经检查了数组的内容(实际上,我正在检查标签是否已应用于UIViews),我不知道多长时间它会让我意识到日志告诉我的是什么。感谢所有回复的人!

3 个答案:

答案 0 :(得分:2)

dayBarArray.count为零,循环中的条件为i < dayBarArray.count。在进入循环体之前,它会测试0 < 0,这是假的,因此它永远不会进入身体。

答案 1 :(得分:1)

dayBarArray.count应该返回一个大于0的数字,以便循环至少执行一次。在你的情况下,因为(dayBarArray.count == 0),for循环的condition-expression:

i < dayBarArray.count

为假(因为i == 0),

并且程序的执行不会进入循环。

答案 2 :(得分:1)

只有当dayBarArray.count大于i且你的日志告诉你dayBarArray.count等于0时,你的for循环才会执行,当i也等于0时。

您的代码运行正常。检查将项目添加到dayBarArray的位置。