如何重绘UIView

时间:2011-07-26 11:14:09

标签: iphone objective-c xcode cocoa-touch

在带有线程的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];

但不起作用。

2 个答案:

答案 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: