UIImage 没有显示在 iPad 设备上,但它显示在 iPad 模拟器上
Posted
技术标签:
【中文标题】UIImage 没有显示在 iPad 设备上,但它显示在 iPad 模拟器上【英文标题】:UIImage not showing up on iPad Device, but it shows up on the iPad Simulator 【发布时间】:2012-04-18 07:34:35 【问题描述】:这是我正在使用的代码。请记住,这在模拟器中工作得很好。但是,当我在 iPad 设备上测试时运行相同的代码时,它不会加载图像。为什么会这样?
SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/folder/Photos/thumbnails/IMG_1780.JPG"];
UIImage *cachedImage = [manager imageWithURL:url];
if (cachedImage)
// Use the cached image immediatly
else
// Start an async download
[manager downloadWithURL:url delegate:self];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
[button setImage:cachedImage forState:UIControlStateNormal];
[button addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:button];
return cell;
如果有任何帮助,我将不胜感激!谢谢!
编辑:修改后的代码,在 Sim 中仍然有效,但在设备上无效。
- (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image
// Do something with the downloaded image
//testImage = image;
testButton = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
[testButton setImage:image forState:UIControlStateNormal];
[testButton addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/album/Photos/thumbnails/IMG_1780.JPG"];
UIImage *cachedImage = [manager imageWithURL:url];
[self webImageManager:manager didFinishWithImage:cachedImage];
if (cachedImage)
// Use the cached image immediatly
//[self webImageManager:manager didFinishWithImage:cachedImage];
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)];
[button setImage:cachedImage forState:UIControlStateNormal];
[button addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:testButton];
else
// Start an async download
[manager downloadWithURL:url delegate:self];
【问题讨论】:
【参考方案1】:从未使用过 SDWebImageManager,但只是快速浏览了一下,看起来您做的一切都是正确的!另一方面,它不工作所以......
我曾经遇到过类似的问题,在扯了很多头发之后,我最终发现设备和模拟器上使用的文件系统不同 - 在你的 iPad 上,我相信它是区分大小写的,但在模拟器。仔细检查文件名的大小写,可能会有所不同。
编辑 - 另外,我假设您正在尝试使用缓存的图像(这就是它立即出现的原因),但如果您正在下载一个,那么我希望您的按钮初始化代码为时过早。
另一个编辑 - 代表!
你知道如何使用 SDWebImageManager 的委托吗?它可能有一个在图像下载时调用的方法——你需要在你设置按钮的类中实现 SDWebImageManager 委托协议等——会有一个类似于 -(void)imageDidFinishDownloading:(UIImage *)myImage,您必须包含它,这就是您需要将图像放入按钮的位置。
【讨论】:
嗯,有道理!我确实尝试过实现这个人(通过实现我只是指将这个 sn-p 添加到我的代码中,仅此而已)。 - (void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image // 对下载的图像做一些事情 testImage = image;无济于事......我试图将加载的图像设置为我在创建按钮时使用的全局 uiimage testImage,尽管它即使在模拟器中也不起作用。我很可能犯了一个小错误。 我想我添加了您在上面更改的代码中描述的内容。如果你能看一下,我将不胜感激。 您是否检查过委托方法是否被调用?另外,你检查文件名的大小写了吗? 再次查看您的代码,我刚刚注意到按钮位于表格单元格中,这意味着最简单(可能)的方法是将下载的图像存储在一个数组中(1 个元素每行)并在调用委托方法时重新加载表并且(您必须!)在那里设置按钮图像,否则您将无处创建一个按钮 - 没有看到更多代码,我不知道你是如何'会知道图像是针对哪一行的...【参考方案2】:可能有点太明显了,但是,您是否检查过您的 iPad 是否有互联网连接?
【讨论】:
是的,我希望就这么简单。 :) 所有连接。 如果您还有其他想法,请告诉我!【参考方案3】:当您尝试创建 UIButton 时,异步下载可能未完成。最后一段代码应该在下载完成后在if
语句中调用(据我从这段代码中可以看出)。
【讨论】:
【参考方案4】:写一个新答案比编辑我的上一个答案更容易。
这里有一些可能有用的代码 -
-(void)webImageManager:(SDWebImageManager *)imageManager didFinishWithImage:(UIImage *)image
// unless you have a way to know which row it's going into, we'll just add it to the end of the array
[downloadedImages addObject:image];
[myTable reloadData];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [downloadedImages count];
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
NSInteger row = indexPath.row;
UIImage *theImage = [downloadedImages objectAtIndex:row];
UIButton *testButton = [[[UIButton alloc] initWithFrame:CGRectMake(80+196, 5, 192, 192)] autorelease];
testButton.tag = row; // so we know which row the pressed button is in
[testButton setImage:theImage forState:UIControlStateNormal];
[testButton addTarget:self action:@selector(imageSelected:) forControlEvents:UIControlEventTouchUpInside];
[cell.contentView addSubview:testButton];
return cell;
-(void)imageSelected:(UIButton *)pressedButton
NSInteger row = pressedButton.tag;
// now you know which row was pressed...
在此处更改您的代码(不要将其放在 tableView:cellForRowAtIndexPath: 方法中!)-
SDWebImageManager *manager = [SDWebImageManager sharedManager];
NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.net/folder/Photos/thumbnails/IMG_1780.JPG"];
UIImage *cachedImage = [manager imageWithURL:url];
if (cachedImage)
// Use the cached image immediately
[downloadedImages addObject:cachedImage];
[myTable reloadData];
else
// Start an async download
[manager downloadWithURL:url delegate:self];
显然这是非常基本的 - 您需要添加东西来重置表格,或者如果图像超过几个,则将图像写入文件。希望对您有所帮助!
【讨论】:
以上是关于UIImage 没有显示在 iPad 设备上,但它显示在 iPad 模拟器上的主要内容,如果未能解决你的问题,请参考以下文章
在后台加载 MKMapView 并从中创建 UIImage (iPhone & iPad)
为啥这个脚本不能在 android、iphone、ipad 等移动设备上运行?
有没有在 iOS 设备上显示 Android PhotoSphere 的方法?