【问题标题】:TTTableImageItem doesn't load the image until scrollTTTableImageItem 在滚动之前不会加载图像
【发布时间】:2009-07-14 13:06:56
【问题描述】:

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

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

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

有人吗?提前致谢。

附注: 如果我在任何随机 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 的全部内容,异步下载),它将不会启动。如果我在主线程上开始下载,它会立即开始..

【问题讨论】:

    标签: iphone uitableview three20


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • TTImageView 自己处理这类事情,在这种情况下应该这样做。 reloadData 不是一个选项..永远。即使没有这个问题,每次下载图像(可能是很多图像)时调用 reloadData 肯定会弄乱表格。
        【解决方案4】:

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

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

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

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

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

          • 我得到了延迟加载原理,但这是一个线程问题。 NSURLRequest 只能在主线程上执行。
          【解决方案6】:

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

          [TTURLRequestQueue mainQueue].suspended = NO;
          

          - (void)didLoadModel:(BOOL)firstTime.

          【讨论】:

            猜你喜欢
            • 2017-05-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-12
            • 1970-01-01
            相关资源
            最近更新 更多