在调试iPad代码时如何在UI上看到中间更新?

时间:2011-02-10 07:18:35

标签: iphone xcode ipad

我正在开发一个使用plist文件的应用程序。 plist中有21个键值对。每对都是一个包含6个项目的字典(类型)。字典包含一组图像。在我的程序中,我使用路径来检索图像。我的要求是图像应该在imageView上逐个显示。我成功完成了。这些图像与plist完全不同。

所以我的问题是我可以使用调试器来查看plist的中间执行吗?当我在我的代码中放置断点并使用调试器运行时,我能够进入代码并且只有在完成具有21个键值对的plist的整个执行之后才在视图上显示图像。在调试每对时,如何在视图上看到图像?

(void)setSequenceInfo:(NSDictionary *)sequenceInfo
{
    [self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.sequenceQueue = [NSMutableArray array];

    //load the sequenceinfo dictionary
    [_sequenceInfo release];

    if (!sequenceInfo)
       return;

    _sequenceInfo = [sequenceInfo retain];

    //create one UIImageView by sequence
    NSMutableDictionary* views = [NSMutableDictionary dictionaryWithCapacity:[sequenceInfo count]];
    for (NSString* identifier in _sequenceInfo)
    {
        UIImageView* seqView = [[UIImageView alloc] initWithFrame:self.bounds];
        seqView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        seqView.contentMode = self.contentMode;

        //the image is hidden until its sequence is played
        seqView.hidden=YES;
        //add the newly created image view to our subviews
        [self addSubview:seqView];
        //also store it in our sequenceViews dictionary
        [views setValue:seqView forKey:identifier];

        [seqView release];
    }
    self.sequenceViews = views;
}

2 个答案:

答案 0 :(得分:0)

为了在使用调试器时“看到”中间结果,您必须更改代码的结构以返回到主运行循环,以便UIImageView有机会运行并显示新映像。您可以设置定期触发的计时器,并在计时器例程中将UIImageView的图像更改为序列中的下一个图像。然后在gdb中的计时器处理程序方法中设置断点,并在每次看到之前显示的图像时点击该断点。

编辑:这里有一些更详细的信息,基于我认为你想做的事情。但要意识到,当你在调试器中时,我认为没有“魔杖”可以在屏幕上看到变化。您必须返回Run Loop,以便您的UIKIt小部件获得绘制自己的周期。

例如,假设你有这种方法:

- (void) updateTwoLabels:(NSString *)newText
{
    self.label1.text = newText;
    self.label2.text = newText;  // put breakpoint on this line
}

并且您希望在设置label2的文本之前停止在调试器中,并且看到label1已更改。好吧,我认为没有办法做到这一点,除非修改你的代码,并用performSelector再次调用自己:withObject:afterDelay:这样主运行循环可以运行一段时间再调用你的代码:

BOOL callAgain = NO;
BOOL setLabel2 = YES;
- (void) updateTwoLabels:(NSString *)newText
{
    self.label1.text = newText;
    if ( setLabel2 )
        self.label2.text = newText;  // put breakpoint on this line
    if ( callAgain )
        [self performSelector:@selector(updateTwoLabels:) withObject:newText afterDelay:0];
}

这样,当你进行调试时,你可以在gdbg中将callAgain设置为YES并将setLabel2设置为NO,并保持“继续”直到你看到label1已经改变。这是基本技术。

答案 1 :(得分:0)

在后台线程中执行整个方法,但在主线程上调用GUI内容。例如:[self performSelectorOnMainThread:@selector(addSubview :) withObject:seqView waitUntilDone:YES]。不要忘记在方法的开头(在后台线程中运行的那个)创建一个自动释放池,并将其排除在它的末尾。