2

我正在为我的 iPhone 应用程序使用three20 项目。我已经缩小了我的问题范围,现在我只是尝试重新创建项目附带的“表格中的 Web 图像”示例。我已经完全复制了项目中的代码,除了我不使用 TTNavigator(示例使用)但我将我的 TTTableViewController 手动添加到 tabBar。

问题如下;表中的图像应自动从网络加载,如示例中所示。但它们只有在我上下滚动表格后才会加载。

在控制台中,它清楚地表明它正在下载图像,并且您会看到活动指示器像永远一样旋转。除非我上下滚动一次,否则图像将永远不会出现。

任何人?提前致谢。

PS:如果我在任何随机 UIView 中使用此代码,它也不起作用(只显示一个黑色方块):

TTImageView* imageView = [[[TTImageView alloc] initWithFrame:CGRectMake(30, 30, 100, 100)] autorelease];
imageView.autoresizesToImage = YES;
imageView.URL = @"http://webpimp.nl/logo.png";
[self.view addSubview:imageView];

如果我将此代码放在我的 AppDelegate 中(就在窗口上),它确实有效.. 奇怪吗?

可能的解决方案: 虽然我出于此目的停止使用 TTImageView,但我确实认为我发现了问题所在;线程(因此接受 Deniz Mert Edincik 的回答)。如果我从除主线程之外的任何地方开始异步下载(因为基本上这就是 TTImageView 的全部内容,异步下载),它将不会启动。如果我在主线程上开始下载,它将立即开始..

4

6 回答 6

5

对我来说听起来像是一个线程问题,你是在主运行循环中创建 TTImageView 吗?

于 2009-09-14T19:38:35.083 回答
1

我发现一件有趣的事情。当我使用 TTTableViewController、TTTableViewDataSource 和 TTModel 组合时,我在加载 TTImageView 时遇到了同样的问题。我的问题是,模型方法“isLoading”和“isLoaded”的实现在模型初始化后没有返回正确的值。这迫使我在“viewDidAppear”方法中手动调用模型重新加载,这会导致图像加载问题。所以我修复了我的“isLoading”和“isLoaded”方法,在模型初始化后都返回“NO”,一切都很好。

于 2010-02-25T21:46:26.403 回答
0

当图像完成加载时,尝试向表视图发送 reloadData 消息。这会强制表格重新计算行的大小并重新绘制表格。请注意不要在响应此消息时再次开始下载图像。

于 2009-07-14T14:27:32.310 回答
0

我写过类似的东西,其中图像视图将从网络加载它自己的图像。

我的经验是,当图像已成功加载但未显示在其视图中时,需要告诉单元格重绘。

当您滚动表格视图时,单元格被设置为在屏幕出现时重绘,这就是滚动时它们出现的原因。

当图像加载时,通过向单元格发送消息 setNeedsDisplay 来告诉单元格它正在重绘。

这样,当图像完成下载时,它所在的单元格(并且只有那个单元格)将重新绘制自身以显示新图像。

您可能不需要重新绘制整个单元格,并且可以使用相同的方法调用简单地重新绘制图像视图。根据我的经验,我的表格单元格视图层次结构被展平了,所以我不得不重绘整个单元格。

于 2009-07-14T19:18:44.767 回答
0

对于您想要做什么,我没有答案,但我会说这被认为是一项功能,也是预期的行为。当您想要延迟加载图像时,您可以在 UITableView 中使用 TTImageView。TTImageView 只会加载其帧在屏幕上可见的图像。这样,设备使用其网络资源来下载用户面前的图像,而不是用户甚至没有尝试查看的一堆图像。

考虑有一个可能包含几百个缩略图的长列表(如朋友列表)。我从经验中知道,如果您在旧设备上启动 100 多个图像请求,内存使用量将达到上限,您的应用程序可能会崩溃。TTImageView 解决了这个问题。

于 2010-06-30T14:50:12.680 回答
0

这是一个线程问题。您可以通过包含以下行来加载图像:

[TTURLRequestQueue mainQueue].suspended = NO;

- (void)didLoadModel:(BOOL)firstTime.

于 2012-03-28T11:29:29.060 回答