1

我需要你在这个问题上逗我一下。这有点伪代码,因为实际情况相当复杂。除非需要,否则我不会以这种方式加载图像。假设我需要。

NSURL *bgImageURL = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];

UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:bgImageURL]];

[self.anIBOutletOfUIImageView setImage:img];

但我崩溃了

-[__NSCFData _isResizable]: unrecognized selector sent to instance 0x9508c70

如何将 URL 中的图像加载到 NSData 中,然后将该 NSData 加载到 UIImage 中并将该 UIImage 设置为我的 UIImageView 的图像?

再一次,我意识到这听起来像是胡说八道,但由于我正在使用图像缓存系统,我必须这样做:(

4

2 回答 2

5

我通常如何处理这种情况(未编译,未测试):

NSURL * url = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];
NSURLRequest * request = [NSURLRequest requestWithURL:url];
[NSURLConnection sendAsynchronousRequest:request
                                   queue:[NSOperationQueue currentQueue]
                       completionHandler:^(NSURLResponse * resp, NSData * data, NSError * error) {

    // No error handling - check `error` if you want to
    UIImage * img = [UIImage imageWithData:data];
    [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:img waitUntilDone:YES];

}];

这避免了调用 隐含的长时间运行的网络请求dataWithContentsOfURL:,因此您的应用程序可以在为图像下载数据的同时继续在主线程上执行操作。

作为旁注,您似乎遇到了与此问题相同的错误;您可能想要检查您是否没有遇到对象分配问题。

于 2012-05-06T20:16:13.930 回答
1

我将此代码插入到一个新的 iPad“单视图应用程序”模板中:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSURL *bgImageURL = [NSURL URLWithString:@"https://www.google.com/images/srpr/logo3w.png"];
    NSData *bgImageData = [NSData dataWithContentsOfURL:bgImageURL];
    UIImage *img = [UIImage imageWithData:bgImageData];
    [[self Imageview] setImage:img];
}

我得到了正确加载的图像。我什至为 UIImageView 尝试了不同的内容模式,它们都按预期工作。

如果你从头开始,你会遇到同样的问题吗?

错误消息表明您正在向 NSData 对象发送“_isResizable”消息。也许您无意中将UIImageView'image属性设置为等于NSData而不是UIImage.

编辑/更新

我什至回去尝试了不同版本的“单线”代码,看看是否有任何问题,因为我的“工作”副本与您的非工作副本略有不同。我无法破解代码。我的猜测是有问题的代码没有损坏,但附近的东西是......

于 2012-05-06T20:22:59.757 回答