在带有线程的loadDidLoad控制器调用方法中,如:
- (void)viewDidLoad {
[super viewDidLoad];
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadImages) object:nil];
[self.operationQueue addOperation:operation];
[operation release];
}
loadImages方法下载图片并显示:
- (void) loadImages {
@synchronized (self) {
// download image...
// ...
// and next:
UIImageView *imageView = [imageViews objectAtIndex:currentImageIndex];
[imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
[imageView performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES];
}
//...
}
如果第一次显示视图,下次我必须旋转iphone才能显示图像。 为什么视图不重绘?
我根据建议尝试了这段代码:
// imageButton is a UIView with button, image and label
NSData *imageData = [[HttpClient sharedInstance] getResourceWithCache:thumbPath];
[imageButton performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageWithData:imageData] waitUntilDone:YES];
[imageButton performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
[imageButton drawRect:imageButton.frame];
但不起作用。
答案 0 :(得分:4)
你的问题在行
[imageView performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
你需要在self.view中调用setNeedsDisplay而不是self,因为这是UIView的方法,而不是UIViewController。
通过继承视图并在drawRect:中设置断点来仔细检查,因为setNeedsDisplay必须调用drawRect。
答案 1 :(得分:0)
我假设loadDidLoad
是一个拼写错误,你的意思是viewDidLoad
。
视图控制器加载完成后,将调用viewDidLoad
方法。它只执行一次,除非应用程序收到内存警告并且视图控制器被卸载。
如果您保留视图控制器并稍后再次显示相同的视图控制器对象,则不会再次调用viewDidLoad
方法。
如果每次将视图控制器推入视图堆栈时都需要执行操作,则可以使用viewWillAppear:
或viewDidAppear:
。