[英]how to change a UILabel of a UIViewController from another UIViewController
[英]Objective C - How to change image from another class (another UIViewController)
我正在使用NSObject
类来处理一些服务器方法。
其中一种方法是从DB(parse.com)下载图像。
问题在于,显示图像的UIViewController
加载速度比下载过程(图像始终为nil
)要快,并且在将图像放入设备后仅2秒。
如何从NSObject
类(带有下载方法的类)更新UIImageView
图像(userProfile类)?
UIViewController
在UITabBar
我知道如何检测下载过程的结束,但是我不知道如何从另一个类访问UIImageView属性。
使用delegate
来满足您的要求。 检查实现委托或ios_delegates如何完成。
以下是一些理解:
说你在NSObject类中有委托方法来处理一些服务器方法
@protocol YouNSObjectClassDelegate <NSObject>
@required
-(void)imageDownloaded:(UIImage*)image;
@end
加
@property (nonatomic,strong) id<YouNSObjectClassDelegate> delegate;
在分配对象的任何viewcontroller时,不要忘记初始化委托
yourNSObjectClassObject.delegate = self;
在NSObject类中下载图像时
if ([delegate respondsToSelector:@selector(imageDownloaded:)]) {
[delegate imageDownloaded:image];
}
在你想要有图像的UIViewController中添加这些方法
-(void)imageDownloaded:(UIImage*)image
{
//Set Image here
}
当您调用NSObject Class
只需将UIImageView
传递给其他参数,下载图像时,只需将新图像设置为UIImageView
。 我猜您正在使用线程概念,因此仅在Main Thread
上更新UIImageView
。 您可以使用
dispatch_async(dispatch_get_main_queue(), ^(void){
//Set your Image to UIImageView
});
或使用
[self performSelectorOnMainThread:@selector(updateImage:) withObject:objects waitUntilDone:YES];
或者更好的是,您可以编写自己的block
或delegate
方法,并在下载图像时传递下载的图像。
在tableView的cellForRowAtIndexPath
方法中,而不是直接设置图像,而是使用GCD异步和完成块。
在下载类标题中,声明一个带有完成块的新方法:
- (void)downloadImagesWithCompletion:(void (^)(void))completion;
并执行:
- (void)downloadImagesWithCompletion:(void (^)(void))completion {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, NO), ^(void){
// Run your downloading here, and once your operation is complete...
dispatch_async(dispatch_get_main_queue(), ^(void){
completion();
});
});
}
在视图控制器的处理方法中,如下调用:
[downloader downloadImagesWithCompletion:^(void) {
{
// your downloader is now complete, run your UI updates
}];
注意:此示例在完成块中不包含任何返回值,但是您也可以轻松地做到这一点 。
您最好考虑一下,因为UIViewController是老板。 这意味着UIViewController开始下载图像,处理完成并设置Tabbar图像。 下载映像过程的类别只是一个工作者。 工人将老板委派给重要的决定。
下载图像处理类试图直接设置Tabbar图像不是一个好主意。 将类设计为具有委托协议或阻止功能以告知“某人”完成图像下载是一个好主意。
您最好使用SDWebImage库。 图书馆的设计就像我说的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.