我正在为我的iPhone应用程序使用three20项目。我已经缩小了我的问题,现在我只是想重新创建项目附带的'Web Images in Table'示例。我已经像在项目中一样复制了完全的代码,但我不使用TTNavigator(示例),但是我将TTTableViewController手动添加到tabBar。
问题如下;表中的图像应自动从Web加载,如示例中所示。但是他们只在之后加载我上下滚动表格。
在控制台中,它清楚地说它正在下载图像,你会看到活动指示器永远旋转......除非我上下滚动一次,否则图像将永远不会出现。
任何?提前谢谢。
P.S: 如果我在任何随机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都是异步下载),它就无法启动。如果我在主线程上开始下载,它会立即启动..
答案 0 :(得分:5)
对我来说听起来像是一个线程问题,你在主runloop中创建TTImageView吗?
答案 1 :(得分:1)
我发现了一件有趣的事情。当我使用组合TTTableViewController,TTTableViewDataSource和TTModel时,我在加载TTImageView时遇到同样的问题。我的问题是,模型初始化后,我的模型方法'isLoading'和'isLoaded'的实现没有返回正确的值。这迫使我在'viewDidAppear'方法中手动调用模型上的重载并导致图像加载问题。所以我修复了'isLoading'和'isLoaded'方法,以便在Model init之后返回'NO',一切都很好。
答案 2 :(得分:0)
当图像完成加载时,尝试将reloadData消息发送到表视图。这会强制表重新计算行的大小并重绘表。请注意,不要再次开始下载图像以响应此消息。
答案 3 :(得分:0)
我写过类似的内容,图片视图会从网上加载自己的图像。
我的经验是,当图像成功加载但未在其视图中显示时,需要告知细胞需要重绘。
滚动表格视图时,单元格设置为在屏幕上显示时重绘,这就是滚动时出现的原因。
当图片加载时,通过发送消息setNeedsDisplay告诉单元格它正在重绘。
这样,当图像完成下载时,它所在的单元格(只有那个单元格)会重绘自己以显示新图像。
您可能不需要重绘整个单元格,并且可能只需使用相同的方法调用重新绘制图像视图即可。根据我的经验,我的表格单元格视图层次结构是扁平的,因此我不得不重绘整个单元格。
答案 4 :(得分:0)
我对想要要做的事情没有答案,但我会说这被视为一项功能,以及预期的行为。当您想要延迟加载图像时,可以在UITableView中使用TTImageView。 TTImageView仅加载帧在屏幕上可见的图像。这样,设备就会使用其网络资源来下载用户面前的图像,而不是用户甚至不想看的一堆图像。
考虑使用可能包含几百个缩略图图像的长列表(如朋友列表)。我从经验中知道,如果您在较旧的设备上启动100多个图像请求,内存使用量将会上升,您的应用程序可能会崩溃。 TTImageView解决了这个问题。
答案 5 :(得分:0)
这是一个线程问题。您可以通过包含以下行来加载图像:
[TTURLRequestQueue mainQueue].suspended = NO;
- (void)didLoadModel:(BOOL)firstTime
中的。