滚动UITableView
时我的UITableViewCell
位置发生了变化。在这里,我有更多的UITableViewCell
.因此,它涵盖了多个页面屏幕。当我从上到下滚动时,UITableViewCell
的位置发生了变化,例如第一个单元格变成了第 5 个。第二个单元格来到第一个等等。
我的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"SignUpWithEmailCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
switch (indexPath.row) {
case 0: {
UILabel *lblFirstName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)];
lblFirstName.text = @"First Name";
[cell.contentView addSubview:lblFirstName];
self.txtFirstName = [[UITextField alloc]initWithFrame:CGRectMake(lblFirstName.frame.origin.x + lblFirstName.frame.size.width + 5, 0, 190, 40)];
self.txtFirstName.delegate = self;
self.txtFirstName.text = strFirstName;
self.txtFirstName.tag = 0;
self.txtFirstName.userInteractionEnabled = YES;
self.txtFirstName.font = [UIFont systemFontOfSize:15.0];
self.txtFirstName.clearButtonMode = UITextFieldViewModeWhileEditing;
self.txtFirstName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[cell.contentView addSubview:self.txtFirstName];
break;
} case 1: {
UILabel *lblLastName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)];
lblLastName.text = @"Last Name";
[cell.contentView addSubview:lblLastName];
self.txtLastName = [[UITextField alloc]initWithFrame:CGRectMake(lblLastName.frame.origin.x + lblLastName.frame.size.width + 5, 0, 190, 40)];
self.txtLastName.backgroundColor = [UIColor clearColor];
self.txtLastName.delegate = self;
self.txtLastName.tag = 1;
self.txtLastName.text = strLastName;
self.txtFirstName.userInteractionEnabled = YES;
self.txtLastName.returnKeyType = UIReturnKeyDone;
self.txtLastName.clearButtonMode = UITextFieldViewModeWhileEditing;
self.txtLastName.font = [UIFont systemFontOfSize:15.0];
self.txtLastName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[cell.contentView addSubview:self.txtLastName];
break;
}
default:
break;
}
}
return cell;
}
谁能指导我正确存档它..
提前谢谢。
即使单元格不为 nil,也必须设置单元格的可视元素。如果您阅读文档,您会注意到Apple说必须始终在此方法中更新单元格的内容。原因是因为检查 nil 只是测试您是否必须创建新单元格。如果您不需要创建新单元格,则意味着您正在重复使用单元格,因此它很可能会显示您预期行以外的行中的内容。因此,每次在此方法中都应重置内容。
从本文档:
表视图的数据源实现 tableView:cellForRowAtIndexPath: 在重用单元格时应始终重置所有内容。
以下是一些帮助您入门的代码...但它需要改进,因为您正在此方法中向单元格添加子视图。仅当单元格为 nil 时,才应发生这种情况,并且您应该存储对这些子视图的引用,以便可以在其他时间访问它们。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"SignUpWithEmailCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
cell.backgroundColor = [UIColor clearColor];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
switch (indexPath.row) {
case 0: {
UILabel *lblFirstName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)];
lblFirstName.text = @"First Name";
[cell.contentView addSubview:lblFirstName]; // TODO: MUST BE MOVED
self.txtFirstName = [[UITextField alloc]initWithFrame:CGRectMake(lblFirstName.frame.origin.x + lblFirstName.frame.size.width + 5, 0, 190, 40)];
self.txtFirstName.delegate = self;
self.txtFirstName.text = strFirstName;
self.txtFirstName.tag = 0;
self.txtFirstName.userInteractionEnabled = YES;
self.txtFirstName.font = [UIFont systemFontOfSize:15.0];
self.txtFirstName.clearButtonMode = UITextFieldViewModeWhileEditing;
self.txtFirstName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[cell.contentView addSubview:self.txtFirstName]; // TODO: MUST BE MOVED
break;
} case 1: {
UILabel *lblLastName = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 100, 40)];
lblLastName.text = @"Last Name";
[cell.contentView addSubview:lblLastName]; // TODO: MUST BE MOVED
self.txtLastName = [[UITextField alloc]initWithFrame:CGRectMake(lblLastName.frame.origin.x + lblLastName.frame.size.width + 5, 0, 190, 40)];
self.txtLastName.backgroundColor = [UIColor clearColor];
self.txtLastName.delegate = self;
self.txtLastName.tag = 1;
self.txtLastName.text = strLastName;
self.txtFirstName.userInteractionEnabled = YES;
self.txtLastName.returnKeyType = UIReturnKeyDone;
self.txtLastName.clearButtonMode = UITextFieldViewModeWhileEditing;
self.txtLastName.font = [UIFont systemFontOfSize:15.0];
self.txtLastName.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
[cell.contentView addSubview:self.txtLastName]; // TODO: MUST BE MOVED
break;
}
default:
break;
}
return cell;
}
你的问题if (cell == nil)
第一次单元格为零时,我制作了一个单元格,然后我尝试重用 de 单元格,单元格不为空,所以我像以前一样添加这个单元格,不做任何更改,为了解决您的问题,您必须删除if
,对于没有泄漏,最好制作一个包含所有对象的自定义单元格。
为了优化内存,iOS初始化并仅使用屏幕显示的单元格。当您滚动以查看下一个内容时,它会将不可见的单元格取消排队,并将其用于新的可见单元格。因此,第 8 行使用第一个单元格,依此类推。现在,在代码中,不会在发生此取消排队操作时重置内容。仅当单元格不存在时,所有单元格内容代码才会出现。从您的 IF 条件中取出单元格初始化代码,您应该很高兴。