2

我的问题:我有一个用于创建列表的 UITableView 部分。每个 TableViewCell 中都有 UITextField。当您开始键入文本字段时,将插入一个新单元格。所有这些功能都可以完美运行。但是,如果用户创建了许多单元格,它们就会离开屏幕并出现问题。特别是该部分顶部的单元格开始被重用。这会导致新单元格中出现不需要的文本,并删除旧单元格中的文本。我该如何解决这个问题?

此问题的图片:( 在第二张图片中,当我开始输入第 6 项时,第 1 项出现在其下方)

在此处输入图像描述

在此处输入图像描述

创建 UITableViewCells 的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *CellIdentifier = @"AddListInformationCellid";


    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {

        // Intialize TableView Cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.backgroundColor = [UIColor whiteColor];


        // Initialize TextField
         // ... code ommitted for brevity

        // Custome intializiation per each kind of TextField
        if (indexPath.section == 0) {
            playerTextField.tag = 0;
            playerTextField.placeholder = @"Title";
        }
        else if (indexPath.section == 1) {

            // Here's where the problem starts *********

            playerTextField.tag = indexPath.row + 1;
            playerTextField.placeholder = @"List Item";
        }

            [cell.contentView addSubview:playerTextField];
    }


    return cell;
}

添加/删除单元格的代码

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSInteger section = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].section;
    NSInteger row = [self.tableView indexPathForCell:(UITableViewCell *)textField.superview.superview].row;

    if (section == 0) {

        _myList.name = textField.text;
    }
    else if (section == 1) {

        // Delete cell that is no longer used
        if ([string isEqualToString:@""]) {
            if (textField.text.length == 1) {
                if (cellCount > 1) {
                cellCount = cellCount - 1;

                [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];

                textField.text = @"";
                }
            }
        }

        // Add a new cell
        if (self.beganEditing) {
            if (![string isEqualToString:@""]) {
            if (row == [self.tableView numberOfRowsInSection:1] - 1) {
                cellCount = cellCount + 1;
                [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:row + 1 inSection:1]] withRowAnimation:UITableViewRowAnimationAutomatic];
                self.beganEditing = NO;
                }
            }
        }
    }    

    return YES;
}
4

3 回答 3

4

正如@Bruno 所说,您需要注意在单元初始化中放入的内容。一个好的一般规则是只将通用规则放入cell == nil条件句中。任何取决于表格视图中单元格位置的内容都需要超出此if语句。

在上面的代码中,您有一个注释“每种文本字段的自定义初始化”。这是一个很好的指标,表明此代码需要超出if语句。

其次,您不能依赖表格视图单元格来为您保留数据。如果您还没有,则需要保留一个字符串数组,代表文本字段区域中的每个条目。然后当表格视图询问单元格时,您可以根据条件之外的 索引路径设置每个文本字段的文本。cell == nil

也看看这个答案

希望这可以帮助!

于 2013-07-18T02:15:41.597 回答
3

你的错误在

if (cell == nil)

你的代码的一部分。您没有考虑else,这是重复使用单元格时的情况。(单元格被重复使用,这就是它出现在底部的原因)。

您应该确保您处理重用案例(换句话说,您在重用时相应地配置您的单元格)

于 2013-07-18T02:02:42.860 回答
1

我发现了你的问题。但这有点难说。

试想一下,当表格视图要连续显示一个单元格时,它会在重用队列中选择一个与要显示的单元格类型相同的单元格。换句话说,表格视图只知道它选择的重用单元格的类型,并且单元格的注释由哪一行识别!所以让我们看看你的代码。

您可以知道,当为 nil 时,您只使用文本创建一个单元格。但是,在使用的时候,同类型的单元格不知道他在哪一行,所以不知道它持有什么样的评论,只是呈现了它的最后一个信息!!

这是解决方案。尝试将您的信息保存在一个组织良好的数组中(例如:您可以通过它所在的行来支持您的信息),基于它的行,尝试通过它与信息数组相关的哪一行来更新您的单元格的注释。

希望它可以帮助:)

于 2013-07-18T02:21:41.960 回答