我正在尝试从服务器中提取的NSData
中加载图像并将其显示在自定义UITableViewCell
中,但它无法正常工作并且反复重复图像。
在顶部我们有indexPath.row = 0
,从那里上升。当单元格加载时,它会调用以下代码来加载图像(当使用NSLog时,会为每个图像返回正确的URL),因此它似乎正在下载正确的图像。
- (void) startLoadingImage
{
NSString *url = @"myurlhere";
url = [url stringByAppendingFormat:identifier];
NSLog(@"Image URL: %@", url); //THIS IS WHERE I DETERMINE THAT IT IS DOWNLOADING THE CORRECT IMAGE
NSURLRequest * request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:url]];
NSURLConnection * imageConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[imageConnection start];
}
当从服务器返回NSData
时,单元格使用委托方法...
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
if (!rawData) rawData=[[NSMutableData alloc]initWithLength:0];
[rawData appendData:data];
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Image did finish loading. Displaying...");
[productImage setImage:[[UIImage alloc]initWithData:rawData]];
}
它可以正常工作,加载四个图像,然后它开始重复图像(虽然单元格中的信息,如名称和价格确实显示正确)。这意味着你会看到牛仔裤的照片一遍又一遍,每四个细胞。
这是我的NSLog
输出。再说一遍,看起来一切都是正确的。
2012-02-21 14:45:01.152 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00084@2x.jpg
2012-02-21 14:45:01.173 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00085@2x.jpg
2012-02-21 14:45:01.199 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:01.205 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:11.064 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00086@2x.jpg
2012-02-21 14:45:11.476 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:12.432 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00089@2x.jpg
2012-02-21 14:45:12.751 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00080@2x.jpg
2012-02-21 14:45:13.010 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:13.013 APPNAME[7873:11f03] Image did finish loading. Displaying...
2012-02-21 14:45:14.574 APPNAME[7873:11f03] Image URL: http://www.MYAPPURL.net/production/img/c_00081@2x.jpg
2012-02-21 14:45:14.948 APPNAME[7873:11f03] Image did finish loading. Displaying...
正如您所看到的,它正在加载图像84,85,86,89,80,81,但它只显示图像84,85,86,89,然后重复它们。
有谁知道为什么会这样,为什么?
答案 0 :(得分:4)
UITableView
重复使用您创建的UITableViewCell
个对象(通过dequeueReusableCellWithIdentifier:
方法)。您不应直接修改UITableViewCell
个对象。而是重新加载表数据,然后更新tableView:cellForRowAtIndexPath:
委托方法中的单元格。
在你的视图控制器中,你会有这样的东西:
- (void) connectionDidFinishLoading:(NSURLConnection *)connection { // set the product.image from the response data here // reload table [self.tableView reloadData]; }
重新加载数据将刷新表格单元格,这将调用您的委托方法:
- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"CellId"; UICustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { // create custom cell cell = [[[UICustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease]; } Product *product = [products objectAtIndex:indexPath.row]; cell.textLabel.text = product.name; cell.image = product.image; return cell; }
答案 1 :(得分:0)
在没有看到所有代码的情况下,我认为您可能会遇到将其作为异步连接进行处理的问题。我没有看到你如何将任何特定的单元格绑定到连接请求。
我认为您可能会发现Ray Wenderlich's Multithreading and Grand Central Dispatch on iOS for Beginners Tutorial中的示例非常适合您的目标。我建议你仔细看看这个例子,看看你是否能让它适合你。你可以下载一个样本项目(该页面底部附近的链接),看看它是如何运作的。