Iphone 调试iPad代码时,如何在UI上看到中间更新?
我正在开发一个应用程序,其中我使用的是plist文件。plist中有21个键值对。每对是一个字典类型,有6个条目。词典包含一组图像。在我的程序中,我使用路径来检索图像。我的要求是在imageView上逐个显示图像。我做得很成功。图像正从plist中精确显示 所以我的问题是,我可以使用调试器来查看plist的中间执行吗?当我在代码中放置断点并使用调试器运行时,我能够单步执行代码,并且只有在使用21个键值对执行完plist之后,图像才会显示在视图上。调试每一对时,如何在视图上看到图像Iphone 调试iPad代码时,如何在UI上看到中间更新?,iphone,xcode,ipad,Iphone,Xcode,Ipad,我正在开发一个应用程序,其中我使用的是plist文件。plist中有21个键值对。每对是一个字典类型,有6个条目。词典包含一组图像。在我的程序中,我使用路径来检索图像。我的要求是在imageView上逐个显示图像。我做得很成功。图像正从plist中精确显示 所以我的问题是,我可以使用调试器来查看plist的中间执行吗?当我在代码中放置断点并使用调试器运行时,我能够单步执行代码,并且只有在使用21个键值对执行完plist之后,图像才会显示在视图上。调试每一对时,如何在视图上看到图像 (void)s
(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;
}
为了在使用调试器时看到中间结果,您必须更改代码的结构以返回主运行循环,以便UIImageView有机会运行并显示新图像。您可以设置一个定期触发的计时器,并在计时器例程中将UIImageView的图像更改为序列中的下一个图像。然后,在gdb中的计时器处理程序方法中设置断点,每次点击该断点时,您应该会看到前面显示的图像 编辑:这里有更多的细节,基于我认为你想要做的。不过,请意识到,我认为在调试器中没有魔术棒可以看到屏幕上的更改。您必须返回到Run循环,以便您的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中将callreath设置为YES,将label2设置为NO,并继续进行,直到看到label1已更改。这是基本技术。在后台线程中完成整个方法,但在主线程上调用GUI。例如:[自执行self-performSelectorOnMainThread:@selectoraddSubview:withObject:seqView waitUntilDone:YES]。别忘了在方法开始时创建一个自动释放池,即在后台线程中运行的自动释放池,并在结束时将其耗尽。thanx很多Bogatyr。我是编程新手。你能提供一些符合我要求的代码或示例代码吗。