2011-02-18 68 views
0

下面是代码:的UIImageView定制没有显示出来的UITableViewCell

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

static NSString *CellIdentifier = @"ConvoreCell"; 

ConvoreCell * cell = (ConvoreCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"ConvoreCell" owner:nil options:nil]; 
    for (id currentObject in topLevelObjects){ 
     if ([currentObject isKindOfClass:[UITableViewCell class]]){ 
      cell = (ConvoreCell *) currentObject; 
      break; 
     } 
    } 
} 

NSMutableDictionary *cellValue = [results objectAtIndex:indexPath.row]; 

NSString *picURL = [[cellValue objectForKey:@"creator"] objectForKey:@"img"]; 
if ([picURL isEqualToString:@"https://secure.gravatar.com/avatar/1f043010eb1652b3fab3678167dc0487/?default=https%3A%2F%2Fconvore.com%2Fmedia%2Fimages%2Feric.png&s=80"]) 
    picURL = @"https://convore.com/media/images/eric.png"; 

if ((picURL != (NSString *) [NSNull null]) && (picURL.length !=0)) { 
    NSLog(@"%@", picURL); 
    NSData *imgData = [[[NSData dataWithContentsOfURL: 
         [NSURL URLWithString: 
          picURL]] autorelease] retain]; 
    [cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]]; 

} else { 
    cell.pic = nil; 
} 


//NSLog(@"Name is : %@", [cellValue objectForKey:@"name"]); 
cell.title.text = [cellValue objectForKey:@"name"]; 
cell.info.text = (@"Created by: %@", [[cellValue objectForKey:@"creator"] objectForKey:@"name"]); 
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 



// Configure the cell... 

return cell; 

}

出于某种原因,该图像没有显示出来。我在这里做错了什么?图片的网址是有效的,我查了一下。

我也不想对TableViewCell附属视图,我没有指定因为没有在IB,但它仍然显示了...我的附件属性设置为none已经

回答

1

你在你的代码中有一些问题。

NSData *imgData = [[[NSData dataWithContentsOfURL: 
        [NSURL URLWithString: 
         picURL]] autorelease] retain]; 

前者不是真正的问题(可能是巧合?!),但它很丑陋和令人困惑。摆脱autorelease和保留。您从dataWithContentsOfURL获得的对象:已经自动发布。


[cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]]; 

和你真正的问题可能是这一点。从我所知道的你应该调用init一次;在你分配一个对象之后。

所以,如果cell.pic是的UIImageView我想尝试的代码更改为类似这样:

cell.pic.image = [[[UIImage alloc] initWithData:imgData] autorelease]; 

当你看到你的形象,你应该改变你的代码,以便它保存图像在你用来填充单元格的数据中。每次出现单元时,您都在下载图像。这是你不应该做的事情。但这超出了这个问题。

编辑:

我也不想对TableViewCell的 附件来看,我 没有指定因为没有在IB,但它 仍显示... 我设置配件 属性为none

你呢?但我可以看到这行代码:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
+0

,你能指点我可以保存图像的资源吗? – aherlambang 2011-02-18 17:32:20

0

你应该能够通过只是

[cell.pic initWithImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSUrl NSURL picURL]]]]; 
0

你没有展示你的cellForRowAtIndexPath方法,它的关键是分析发生了什么事情得到一个UIImage的。典型的范例是UITableViewCell对象被UITableView重复使用。当UITableView调用cellForRowAtIndexPath时,应该将UIImage设置到单元格中。

+0

现在编辑代码 – aherlambang 2011-02-18 17:11:02

0

导致您立即崩溃的是,对于ConvoreCell笔尖试图设置你宣布一个IBOutlet,但发现没有办法实际设置的问题。我会检查你是否合成了你的图片属性。 这里还有其他问题。该行

[cell.pic initWithImage:[[UIImage alloc] initWithData:imgData]]; 

是错的;您不要在已经存在的对象上调用init,但仅在分配对象时调用。做类似

cell.pic = [[[WhateverClassPicIS alloc] initWithImage:[[UIImage alloc] initWithData:imgData]]; 

此外,您在主线程上使用NSData dataWithContentsOfURL。当您连接到网络时,这将锁定用户界面的时间不确定。改用异步调用。