gpt4 book ai didi

ios - 从 UITableView 出队后的 UITableViewCell View 不为空

转载 作者:行者123 更新时间:2023-11-28 22:27:52 25 4
gpt4 key购买 nike

我在使用 UITableViewdequeueReusableCellWithIdentifier: 方法时遇到了一个奇怪的问题。不确定我是否不太了解该方法,或者它只是很奇怪。开始了:

我正在使用 UITableView 向用户显示一些数据,并且在我的
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 我像这样使用 dequeue 方法:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell)
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

然后我将一些 subview 添加到单元格的 contentView 属性。当在我的表上向下滚动一点时,我看到那些以前添加的 subview ,即单元格不是空的,而是充满了“旧”数据。如果我不出列,并且每次都只是 alloc-init 一个新的,单元格是空的,但我确实看到了更多的内存消耗,这正是我试图降低一点的。如果这意味着什么,我正在使用 ARC。

我应该怎样解决这个问题?我已经尝试在内容 View 和 [view removeFromSuperview] 的 subview 中运行 for 循环,这确实删除了以前的 View 并稍微降低了内存消耗。但这真的有必要吗?或者有更好的方法吗?

编辑这里是我如何添加 subview 的更多代码

cell.backgroundView = [[UIView alloc] initWithFrame:cell.frame];
cell.backgroundColor = kClearColor; //defined to [UIColor clearColor]
cell.selectionStyle = UITableViewCellSelectionStyleNone;

if (indexPath.row == 0)
{
UIImageView *shine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
shine.image = [UIImage imageNamed:@"top_shine_1"];
[cell.backgroundView addSubview:shine]; //its a gradient thats why its added to background

UILabel *appLabel = [[UILabel alloc] initWithFrame:CGRectMake(55, winSize.height * 0.027, 250, 33)];
appLabel.backgroundColor = kClearColor; //defined to clear color
appLabel.textColor = kWhiteColor; //defined to white color
appLabel.text = [viewOrder objectAtIndex:tableView.tag]; //just an array from where I get the required text
appLabel.font = kStandardFontOfSize(30); //defined to a specific font

[cell.contentView addSubview:appLabel];

UIButton *settingsButton = [UIButton buttonWithType:UIButtonTypeCustom];
settingsButton.frame = CGRectMake(10, winSize.height * 0.0377, 31, 21);
[settingsButton setImage:[UIImage imageNamed:@"settings_button"] forState:UIControlStateNormal];
[settingsButton addTarget:self action:@selector(settings:) forControlEvents:UIControlEventTouchUpInside];

[cell.contentView addSubview:settingsButton];

return cell; //here I just return it since this is all the config the first cell needs
}

NSString *app = [viewOrder objectAtIndex:tableView.tag];
NSArray *boxes = [[plist secondObjectForKey:@"order" parent:app] componentsSeparatedByString:@";"];

//Add necessary shines or create the last logotype cell - just some details and stuff, all are just images
if (indexPath.row == 1)
{
UIImageView *shine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 282.5)];
shine.image = [UIImage imageNamed:@"top_shine_2"];

[cell.backgroundView addSubview:shine];
}
else if (indexPath.row == 2)
{
UIImageView *shine = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, winSize.width, 150)];
shine.image = [UIImage imageNamed:@"main_shine"];

[cell.backgroundView addSubview:shine];
}
else if (indexPath.row == boxes.count + 1)
{
UIImageView *logo = [[UIImageView alloc] initWithFrame:CGRectMake(111.5, 25, 97, 20)];
logo.image = [UIImage imageNamed:@"cell_logo"];

[cell.backgroundView addSubview:logo];
return cell;
}

NSString *databox = [boxes objectAtIndex:indexPath.row - 1];
UIView *view; //Main subview to be added to the cell

/*
here I have a class that creates a view with a bunch of subviews added to that view, the view is then assigned to 'view'; kinda like
view = [someAssembler assembleViewWith:options.....]. all are basically UILabels or ImageViews added to the main view
*/

[cell.contentView addSubview:view]; //and here this 'main view' is added as a subview, this view is still visible after the cell has been dequeued and the shines are as well

return cell;

在你开始批评为什么我不使用单个 UIColor 作为背景和文本颜色之前,让我提醒你,这仍处于测试阶段,稍后会处理。

最佳答案

[cell.backgroundView addSubview:shine]; 这些代码行是你的问题。

您应该在 if (!cell) block 中创建一个完整的可重用单元格,并在每次调用 cellForRow 时重新填充它们。对于每个唯一的小区,应该使用唯一的重用标识符。例如,如果您有多个具有不同布局 subview 的单元格,您应该为它们使用不同的标识符。

在您的特定示例中,必须在 if (indexPath.row == 1) block 中创建单元格。

static NSString *cellIdentifier = @"cell";
UITableViewCell *cell = nil;

if (indexPath.row == 0) {
cellIdentifier = @"topCell";
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
if (!cell) {
// create the cell and add the necessary subviews for indexPath row 0
}
return cell;
}
else if (indexPath.row == 1) {

}

//etc.

不过,您必须使用这种方法为 !cell block 中的每个单元格创建“主 subview ”,因此您可能应该考虑对单元格进行子类化。

关于ios - 从 UITableView 出队后的 UITableViewCell View 不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18416831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com