我有一个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;
}
答案 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];
否则您的子视图可能会与附件视图重叠。当您的单元格调整大小时,您可能会遇到问题。
答案 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];