gpt4 book ai didi

iphone - RootViewController - TableView :cellForRowAtIndexPath - Load image from assetsLibrary

转载 作者:行者123 更新时间:2023-11-29 04:57:53 27 4
gpt4 key购买 nike

StackOverflow 的 friend 和同事程序员,

我的RootViewController( View 上的flowerTableView)应该显示带有标题、副标题和图像缩略图(从相机胶卷加载)的单元格。我想这是一个非常基本的表格。

所有内容都存储在“核心数据”中,但图像存储为相机胶卷的图像路径。示例:flower.imagePath = asset-library://asset/asset.JPG?id=1000000002&ext

使用底部的代码,一切都应该运行顺利,但事实并非如此。启动应用程序时,会显示标题和副标题,但不会显示图像。当我按下一个单元格(显示详细 View )并再次弹出到主视图时,会显示该特定单元格的图像。

当我按“显示全部”时,工具栏上的按钮将执行以下代码

NSFetchRequest *fetchRequest = [[self fetchedResultsController] fetchRequest];
[fetchRequest setPredicate:nil];

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[self.flowerTableView reloadData];

并重新加载表格,现在所有美丽的花朵都显示出来了。

为什么第一次没有展示鲜花?这是缓存问题吗?

调试此代码时,字符串:“此调试字符串在该函数完成后被记录”是在启动应用程序加载表格后记录的,而不是在按“显示全部”后记录的这意味着所有图像均已从相机胶卷成功加载,但在显示单元格后附加到单元格,因此未显示。

按“显示全部”时会按预期打印同一行

希望有人能告诉我这里发生了什么,甚至更好的是,需要对我的代码进行哪些更改才能使这项工作正常进行。我现在陷入困境...

谢谢你帮我!埃德温

:::代码:::

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{

Flower *flower = [fetchedResultsController_ objectAtIndexPath:indexPath];

static NSString *CellIdentifier = @"Cell";

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

// Configure the cell...

// Display the image if one is defined
if (flower.imagePath && ![flower.imagePath isEqualToString:@""])
{
// Should hold image after executing the resultBlock
__block UIImage *image = nil;

ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset *asset)
{
NSLog(@"This debug string was logged after this function was done");
image = [[UIImage imageWithCGImage:[asset thumbnail]] retain];
};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error)
{
NSLog(@"Unresolved error: %@, %@", error, [error localizedDescription]);
};

[assetsLibrary_ assetForURL:[NSURL URLWithString:flower.imagePath]
resultBlock:resultBlock
failureBlock:failureBlock];

[cell.imageView setImage:image];
}

return cell;
}

最佳答案

-[ALAssetsLibrary assetForURL:resultBlock:failureBlock] 异步运行。这意味着调用会立即在 tableView:cellForRowAtIndexPath: 方法中返回。在实际加载资源之前,单元格会显示在表格 View 中。

您需要做的是为结果 block 中的单元格设置图像。像这样:

if (flower.imagePath && ![flower.imagePath isEqualToString:@""])
{
ALAssetsLibraryAssetForURLResultBlock resultBlock = ^(ALAsset *asset)
{
NSLog(@"This debug string was logged after this function was done");
[cell.imageView setImage:[UIImage imageWithCGImage:[asset thumbnail]]];

//this line is needed to display the image when it is loaded asynchronously, otherwise image will not be shown as stated in comments
[cell setNeedsLayout];

};

ALAssetsLibraryAccessFailureBlock failureBlock = ^(NSError *error)
{
NSLog(@"Unresolved error: %@, %@", error, [error localizedDescription]);
};

[assetsLibrary_ assetForURL:[NSURL URLWithString:flower.imagePath]
resultBlock:resultBlock
failureBlock:failureBlock];
}

关于iphone - RootViewController - TableView :cellForRowAtIndexPath - Load image from assetsLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7600693/

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