单元格图像仅在滚动后出现

时间:2012-08-09 11:43:12

标签: iphone ios ipad uitableview uiimageview

我有一个UITableView,方法cellForRowAtIndexPath如下所示,问题是cellImage仅在完全向上滚动(因此没有行可见)然后释放后才会出现。奇怪的是,我在另一个类中有相同的代码用于单独的表视图,并且图像看起来很好。有什么想法吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    [cell.textLabel setText:[items objectAtIndex:indexPath.row]];
    [cell.textLabel setFont:[UIFont fontWithName:@"Helvetica" size:15.0f]];
    [cell.textLabel setTextColor:[UIColor whiteColor]];
    [cell setBackgroundColor:[[UIColor alloc] initWithRed:117.0/255.0 green:118.0/255.0 blue:121.0/255.0 alpha:1.0]];
    [self.tableView setBackgroundView:nil];
    [self.tableView setBackgroundView:[[UIView alloc] init]];
    [self.view setBackgroundColor:[[UIColor alloc] initWithRed:167.0/255.0 green:169.0/255.0 blue:172.0/255.0 alpha:1.0]];
    UIImageView *cellImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"next@2x.png"]];
    [cell addSubview:cellImage];
    [cellImage setFrame:CGRectMake(0, 0, 26, 24)];
    [cellImage setCenter:CGPointMake(cell.frame.size.width - 30, cell.frame.size.height/2)];

    return cell;
}

4 个答案:

答案 0 :(得分:1)

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundView:[[UIView alloc] init]];

这些线条不属于该方法。每次滚动每个单元格时调用方法。在创建表视图后,将它们放在viewDidLoad方法中。

UIImageView *cellImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"next@2x.png"]];
[cell addSubview:cellImage];

这些行非常 BAD ,可能会导致内存泄漏。

每次滚动表格视图时,都会向单元格添加一个imageview。表视图重用单元格。这意味着当重用单元格时,您将向单元格添加新的imageview。滚动更多次后,每个单元格都有x次imageview,除非你在代码中的某处删除它们。

其他一点是,如果你想为一个单元格添加一些子视图(例如在单元格的init方法中),那么将它添加到单元格的contenview中就像这样

[cell.contentView addSubview:someView];

否则您的子视图可能会与附件视图重叠。当您的单元格调整大小时,您可能会遇到问题。

我建议您阅读以下链接中的指南: http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7-SW1

答案 1 :(得分:0)

您面临的问题是由于单元格的reuseIdentifier。 此外,每次执行cellForRowAtIndexPath时都会创建Imageview。

我将为您推荐两种解决方案。

第一个选项: - 只需替换此代码:

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
    cell.accessoryType = UITableViewCellAccessoryNone;
}

当你处理动态图像时,这不是正确的方法,意味着你从服务器上下载缩略图,而数据内容更多,如果它是小而静态的数据那么它对你来说很好。

第二个选项: - 只使用这个格式化的代码,每次只使用带有标记的当前单元格中的对象时,不会创建imageview。

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


    static NSString *CellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
        UIImageView *cellImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 26, 24)];  
        cellImage.tag = 88;
        [cell addSubview:cellImage];
        [cellImage setCenter:CGPointMake(cell.frame.size.width - 30, cell.frame.size.height/2)];

    }
    [cell.textLabel setText:[items objectAtIndex:indexPath.row]];
    [cell.textLabel setFont:[UIFont fontWithName:@"Helvetica" size:15.0f]];
    [cell.textLabel setTextColor:[UIColor whiteColor]];
    [cell setBackgroundColor:[[UIColor alloc] initWithRed:117.0/255.0 green:118.0/255.0 blue:121.0/255.0 alpha:1.0]];
    [self.tableView setBackgroundView:nil];
    [self.tableView setBackgroundView:[[UIView alloc] init]];
    [self.view setBackgroundColor:[[UIColor alloc] initWithRed:167.0/255.0 green:169.0/255.0 blue:172.0/255.0 alpha:1.0]];
    UIImageView *cellImage = (UIImageView *)[cell viewWithtag:88];
    cellImage.image = [UIImage imageNamed:@"next@2x.png"];

}

答案 2 :(得分:0)

正如许多评论所述,存在许多问题:

在viewDidLoad方法(或通过XIB)中设置视图和tableView背景,而不是在cellForRowAtIndexPath中设置

使用cell.imageView属性设置左图标,或者,构建您将使用的自定义单元格[cell.contentView addSubview:cellImage]。如果你使用后者,你也应该以与UILabel相同的方式添加textLabel。

要设置tableview单元格的背景,请使用此委托方法:

-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell*)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
 [cell setBackgroundColor:[[UIColor alloc] initWithRed:117.0/255.0 green:118.0/255.0 blue:121.0/255.0 alpha:1.0]]; 
}

虽然为了提高效率,你应该在viewcontroller中将这个UIColor实例化一次并将其设置为[cell setBackgroundColor:self.cellBackground];

答案 3 :(得分:0)

使用以下代码修复:

UIImageView *cellImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"next@2x.png"]];
[cell setAccessoryView:cellImage];