Ios UITableView滚动UITableView时单元格位置发生变化

Ios UITableView滚动UITableView时单元格位置发生变化,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我的UITableView单元格位置在滚动UITableView时更改。这里有更多的UITableViewCell。所以它覆盖了不止一页的屏幕。当我从上到下滚动时,UITableViewCell的位置会发生变化,例如第一个单元格变为第五个单元格。第二个牢房来到了第一个牢房,以此类推 我的代码: - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)inde

我的
UITableView单元格
位置在滚动
UITableView
时更改。这里有更多的
UITableViewCell
。所以它覆盖了不止一页的屏幕。当我从上到下滚动时,
UITableViewCell
的位置会发生变化,例如第一个单元格变为第五个单元格。第二个牢房来到了第一个牢房,以此类推

我的代码:

    - (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只是测试是否必须创建新单元。如果您不需要创建新的单元格,这意味着您正在重用一个单元格,因此它很可能会显示您想要显示的行以外的行的内容。因此,在该方法中,每次都应重置内容

发件人:

在重用单元格时,tableView的数据源实现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;
}

这是您的问题
如果(cell==nil)
第一次该单元格为nil时,我创建了一个单元格,然后我尝试重用de cell该单元格不为null,因此我像以前一样添加该单元格,不做任何更改,要解决问题,您必须删除
if
,如果没有泄漏,最好创建一个包含所有对象的自定义单元格。

要优化内存,iOS将初始化并仅使用屏幕显示的单元格。当您滚动查看下一个内容时,它会将不可见的单元格排挤出队列,并将其用于新的可见单元格。因此,第8行使用第一个单元格,以此类推。现在,在您的代码中,当发生此出列操作时,您不会重置内容。只有当单元格不存在时,才会显示所有单元格内容代码。从IF条件中取出单元初始化代码,就可以开始了。

我删除了“IF(cell==nil)”循环。现在它可以正常工作了。但我有一个疑问。UITableViewCell是否在滚动时连续创建??它是否会显示一些内存警告?是的,每次添加所有使用addSubview添加的项目时:在最后一个项目上,最好创建一个自定义单元格,并仅替换对象的值。如果必须创建两个不同的类型或单元格,则创建两个自定义单元格,然后切换它们,如果是案例0,则返回firstCustomCell,否则返回secondCustomCell