请在错误的时间查看NSLog

时间:2013-07-22 09:51:19

标签: objective-c cocoa-touch uiimageview nstimer nslog

我有两层。底层由隐藏的UIImageViews组成,上层由可见的UIImageViews组成。他们有标签。当底层UIImageViews的所有帧都等于上层UIImageViews的帧并且标签也匹配时,你必须在NSLog中看到它。问题是当所有标签都不匹配时,我仍然得到NSLog。该方法由NSTimer调用。

这是我的代码:

-(void)allPiecesCorrectPos {

        __block BOOL equal = YES;
        [arrayImg enumerateObjectsUsingBlock:^(UIImageView *ImageView1, NSUInteger idx, BOOL *stop) {
            UIImageView *ImageView2 = HiddenFieldView[idx];
            if (CGRectIntersectsRect(ImageView1.frame, ImageView2.frame) && ImageView1.tag != ImageView2.tag) {

                equal = NO;
                *stop = YES;
            }
        }];
        if (equal) {
            NSLog(@"ALL THE FRAMES ARE EQUAL");
            [AllPosCorrectTimer invalidate];

        }
    }

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

尝试这样,这里每次等值为YES,因为if块在块执行完成之前执行,在这种情况下你需要处理块执行。

-(void)allPiecesCorrectPos {

        __block BOOL equal = YES;
        [arrayImg enumerateObjectsUsingBlock:^(UIImageView *ImageView1, NSUInteger idx, BOOL *stop) {
            UIImageView *ImageView2 = HiddenFieldView[idx];
            if (CGRectIntersectsRect(ImageView1.frame, ImageView2.frame) && ImageView1.tag != ImageView2.tag) {

                equal = NO;
                *stop = YES;
            if (equal) {
            NSLog(@"ALL THE FRAMES ARE EQUAL");
            [AllPosCorrectTimer invalidate];

            }
            }
        }];

    }

答案 1 :(得分:0)

您的代码没有按照您在文本中的要求执行操作。您正在测试UIImageView框架的交叉点是否相等。试试这个(我冒昧地重命名一些方法和变量以便于阅读):

-(void)visiblePiecesEquivalentToHiddenPieces
{
    __block BOOL correspondingPiecesEquivalent = YES;
    [imageArray enumerateObjectsUsingBlock:
        ^(UIImageView *imageView1, NSUInteger index, BOOL *stop)
        {
            UIImageView *imageView2 = hiddenFieldView[index];
            if ( !CGRectEqualToRect(imageView1.frame, imageView2.frame)
                 || imageView1.tag != mageView2.tag )
            {    
                correspondingPiecesEquivalent = NO;
                *stop = YES;
            }
        }
    ];
    if (correspondingPiecesEquivalent)
    {
        NSLog(@"Frames and tags are equal for corresponding views.");
        [pieceCorrespondenceTimer invalidate];

    }
}

详细了解逻辑条件及其组合方式。如果这不是您想要的,请澄清您的问题。

我还建议您停止使用大写字母启动变量名称。大写起始名称通常是 class 名称。对于Objective-C,大写起始变量名称是一种非常罕见的命名约定,它可能使您的代码更难以为其他程序员阅读。 (但如果您因任何原因愿意这样做,请继续。只要保持一致和连贯)。