gpt4 book ai didi

iphone - 为什么 UItableViewCell 图像在滚动之前才加载?

转载 作者:行者123 更新时间:2023-12-03 20:50:07 25 4
gpt4 key购买 nike

我的代码使用 InternetImage 异步下载图像在 tableview: cellForRowAtIndexPath: 方法中,通过使用 initWithURL 初始化 IntentImage 并调用 downloadImage。此代码在向下滚动到 UITableView 中的新单元格 UITableViewCell 之后完美运行,但在此之前则不然,即使 URL 在这两种情况下都是正确的。没有调用 InternetImage 的 NSURLConnection 委托(delegate)方法来通知我有关连接成功或失败的信息,而它们应该是这样。由于图像下载失败,调用 reloadData:setNeedsDisplay:setNeedsLayout: 不会执行任何操作。

这是我的 UiTableViewController 子类的代码:

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Object *object = (Object *)[self.array objectAtIndex:indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"] autorelease];
}

cell.textLabel.text = object.attribute;

if (object.image == nil && object != nil) {
NSString *URLString = [[MyAppDelegate imageURLFromLink:(object.link) withExtension:@".jpg"]absoluteString];

InternetImage *asynchImage = [[InternetImage alloc] initWithUrl:URLString object:object];
[asynchImage downloadImage:self];
}

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

if (object.image != nil && object.thumbnailImage == nil) {

UIImage *image= (UIImage *) object.image;
UIImage *thumbnail = [image _imageScaledToSize:CGSizeMake(75.0, 50.0) interpolationQuality:20];
object.thumbnailImage = thumbnail;
}
cell.imageView.image = object.thumbnailImage;

return cell;
}

最佳答案

对我有用的解决方案是将下载的责任转移到对象,并将处理图像刷新的责任转移到表格单元格本身。如果该对象在屏幕上可见并且具有相应的表格单元格,则图像下载后将立即刷新。

此方法需要进行以下更改:

  • 转移责任将图像下载到对象。
  • 修改对象以在图像更改时发送事件/调用委托(delegate)/通知属性已更改。
  • 子类化 UITableViewCell 以了解它将显示的对象,该对象在分配时将其自身添加为对象的更改委托(delegate)。

以下是其工作原理的草图:

// in the UITableViewController
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
Object *object = (Object *)[self.array objectAtIndex:indexPath.row];

ObjectTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"objectcell"];
if (nil == cell) {
cell = [[[ObjectTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"objectcell"] autorelease];
}

cell.object = object;

return cell;
}

// in Object

- (void) downloadImageIfNeeded {
if (nil == image && nil == internetImage) {
NSString *URLString = [[MyAppDelegate imageURLFromLink:(object.link) withExtension:@".jpg"]absoluteString];

internetImage = [[InternetImage alloc] initWithUrl:URLString object:object];
[internetImage downloadImage:self];
}
}

- (void) internetImageReady:(InternetImage*)downloadedImage {
self.image = downloadedImage.image;
self.thumbnailImage = [image _imageScaledToSize:CGSizeMake(75.0, 50.0) interpolationQuality:20];

// notify the delegate
[imageDelegate imageChanged: self];
}

// in ObjectTableViewCell.h
@property (nonatomic, retain) Object *object;

// in ObjectTableViewCell.m
- (Object *) object {
return object;
}

- (void) setObject: (Object *) obj {
if (obj != object) {
object.imageDelegate = nil;
[object release];
object = nil;

if (nil != object) {
object = [obj retain];
object.imageDelegate = self;

[object downloadImageIfNeeded];
self.textLabel.text = object.attribute;
self.imageView.image = object.thumbnailImage;

self.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
}

- (void) imageChanged: (Object *) o {
self.imageView.image = object.thumbnailImage;
}

关于iphone - 为什么 UItableViewCell 图像在滚动之前才加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1248031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com