gpt4 book ai didi

objective-c - UITableView 重复行

转载 作者:行者123 更新时间:2023-11-29 04:32:44 26 4
gpt4 key购买 nike

这是我在“cellForRowAtIndexPath”中使用的代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString* cellIdentifier = @"OBBirthControlMethodsTableCell";
OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
NSLog(@"cell id - %@",cell.subviews);
CGRect frame = [tableView rectForRowAtIndexPath:0];
if(nil == cell)
{
cell = [[[OBCustomDetailCell alloc]
initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

if (indexPath.row != 3)
{
//Setting the basic template
UIView *template = [[UIView alloc] init];
template.tag = indexPath.row+10;
NSLog(@"path index = %d",indexPath.row);
UIImageView *templateImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0,
200,
frame.size.height)];
UILabel *templateLabel = [[UILabel alloc] initWithFrame:CGRectMake(templateImage.frame.size.width+20,
0,
cell.frame.size.width - templateImage.frame.size.width+20,
frame.size.height)];
[template addSubview:templateImage];
[template addSubview:templateLabel];

[cell.contentView addSubview:template];
}
}

UIView *templateView = [cell.contentView viewWithTag:indexPath.row + 10];
if (templateView)
{
NSLog(@"Gotten a templateView object");
if (indexPath.row == 0)
{
templateView.frame = frame;

for (UIView *view in templateView.subviews)
{
if ([view isKindOfClass:[UIImageView class]])
{
[(UIImageView *)view setImage:[UIImage imageNamed:@"baby.jpeg"]];
}
else if ([view isKindOfClass:[UILabel class]])
{
[(UILabel *)view setText:@"This is not working"];
}
}
}
else
{
templateView.frame = CGRectMake(0, 50,
frame.size.width,
frame.size.height);

}
}
return cell;
}

但问题是,新单元格给我的值与旧单元格相同,一旦向下滚动,新单元格就会出列..

编辑当我们向下滚动到与第一个单元格具有相同值的新单元格时,就会创建一个重复的单元格..

  • 我希望仅为选择的 rows() ..if (indexPath.row != 3) 创建 UIView
  • 我希望 UIView 的位置在某些行中有所不同.. if (indexPath.row == 0)

最佳答案

这段代码有几个问题。首先,也是最重要的,问题的主要原因是:

template.tag = indexPath.row+10;

你为什么要这样做?只需使用一个常量值,例如 10。不需要涉及索引路径,因为每个单元格的索引路径都会改变。这将导致 viewWithTag: 对于重用的单元格失败,并将返回 nil

其次,您不能只为 indexPath.row != 3 设置模板单元格,因为在某些时候,非模板单元格可能会被重用。它不会有模板 View ,因此以下布局将失败。您需要对两种类型的单元使用两个重用标识符。最终产品应如下所示:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *templateCellIdentifier = @"OBBirthControlMethodsTableCell";
static NSString *otherCellIdentifier = @"OtherTableCell";

if (indexPath.row != 3) {
// Handle normal cells
OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:templateCellIdentifier];
if (cell == nil) {
cell = [[[OBCustomDetailCell alloc] initWithStyle:UITableViewStyleDefault reuseIdentifier:templateCellIdentifier] autorelease];
// Set up template cell
}
// Handle per-cell data
} else {
// Handle special cells
OBCustomDetailCell *cell = (OBCustomDetailCell *)[tableView dequeueReusableCellWithIdentifier:otherCellIdentifier];
if (cell == nil) {
cell = [[[OBCustomDetailCell alloc] initWithStyle:UITableViewStyleDefault reuseIdentifier:otherCellIdentifier] autorelease];
// Set up other cell
}
// Handle per-cell data (not really necessary if there's only one of these)
}
}

关于objective-c - UITableView 重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11498907/

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