1

UITextFieldUITableView. 我输入数据并关闭键盘。但是,当我向下滚动并隐藏UITextField然后再次向上滚动时,“UITextField”数据被复制,如下所示:

视图的原始负载:

输入数据:在此处输入图像描述

隐藏文本字段后,然后再次开始编辑:在此处输入图像描述

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                   reuseIdentifier:CellIdentifier];
}

if ([indexPath section] == 0) { // Email & Password Section
    cell.textLabel.text = @"Subject";
} else {
    cell.textLabel.text = @"Task";
}

cell.selectionStyle = UITableViewCellSelectionStyleNone;

if ([indexPath section] == 0) {
    UITextField *subject = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
    subject.adjustsFontSizeToFitWidth = YES;
    subject.textColor = [UIColor blackColor];
    if ([indexPath row] == 0) {
        subject.placeholder = @"Maths";
        subject.keyboardType = UIKeyboardTypeEmailAddress;
        subject.returnKeyType = UIReturnKeyNext;
    }
    subject.backgroundColor = [UIColor clearColor];
    subject.autocorrectionType = UITextAutocorrectionTypeNo;
    subject.autocapitalizationType = UITextAutocapitalizationTypeWords;
    subject.tag = 0;
    subject.clearButtonMode = UITextFieldViewModeNever;
    [cell.contentView addSubview:subject];
} else {
    UITextView *task = [[UITextView alloc] initWithFrame:CGRectMake(102, 0, 185, 40)];
    task.text = @"fasfashfjasfhasfasdjhasgdgasdhjagshjdgashjdgahjsdghjasgasdashgdgjasd";
    task.editable = NO;
    task.scrollEnabled = NO;
    task.userInteractionEnabled = NO;
    task.textColor = [UIColor colorWithRed: 62.0/255.0 green: 85.0/255.0 blue:132.0/255.0 alpha:1.0];
    task.backgroundColor = [UIColor clearColor];
}



return cell;

}

4

2 回答 2

4

就像理查德说的那样,单元格被重用(这就是标识符的目的),这就是为什么你在你tableView:cellForRowAtIndexPath:nil测试中测试dequeueReusableCellWithIdentifier:. 如果一个单元格已经存在(即之前分配的)并且不再显示,dequeueReusableCellWithIdentifier:将使用这个单元格来显示新出现的单元格的内容。

您正在做的是在UITextView每次显示而不是创建单元格时添加您的。因此,每次将一个单元格滚动出屏幕并弹出一个新单元格时,您都会在单元格中添加一个新UITextView单元格。if (cell == nil)您应该只在方法的一部分中添加子视图。由于您的单元格的内容非常不同,我建议使用两个不同的标识符。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifierForSection0 = @"Cell0";
    static NSString *CellIdentifierForSection1 = @"Cell1";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: [indexPath section] == 0 ? CellIdentifierForSection0 : CellIdentifierForSection1];
    if (cell == nil) {

        if ([indexPath section] == 0) { // Email & Password Section

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifierForSection0];
            cell.textLabel.text = @"Subject";

            UITextField *subject = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
            subject.adjustsFontSizeToFitWidth = YES;
            subject.textColor = [UIColor blackColor];
            if ([indexPath row] == 0) {
                subject.placeholder = @"Maths";
                subject.keyboardType = UIKeyboardTypeEmailAddress;
                subject.returnKeyType = UIReturnKeyNext;
            }
            subject.backgroundColor = [UIColor clearColor];
            subject.autocorrectionType = UITextAutocorrectionTypeNo;
            subject.autocapitalizationType = UITextAutocapitalizationTypeWords;
            subject.tag = 0;
            subject.clearButtonMode = UITextFieldViewModeNever;
            [cell.contentView addSubview:subject];
        } else {

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:CellIdentifierForSection1];
            cell.textLabel.text = @"Task";

            UITextView *task = [[UITextView alloc] initWithFrame:CGRectMake(102, 0, 185, 40)];
            task.text = @"fasfashfjasfhasfasdjhasgdgasdhjagshjdgashjdgahjsdghjasgasdashgdgjasd";
            task.editable = NO;
            task.scrollEnabled = NO;
            task.userInteractionEnabled = NO;
            task.textColor = [UIColor colorWithRed: 62.0/255.0 green: 85.0/255.0 blue:132.0/255.0 alpha:1.0];
            task.backgroundColor = [UIColor clearColor];
        }

        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    return cell;
}

请注意,此代码主要用于示例目的,可以大大减少。此外,您应该使用UITableViewCellRichard 建议的子类,因为它有助于组织您的代码并使其更可重用。

不要drawRect:用于添加子视图。这是不必要的,会影响性能。drawRect:仅当您打算使用 CoreAnimation 或 CoreGraphics进行真实绘图时才应使用。添加子视图应在initWithFrame:initWithCoder:取决于您是否使用 Interface Builder 完成。

于 2013-03-16T14:11:54.270 回答
0

记住单元格会被重用,因此每次重用时都会添加子视图。如果要向单元格添加子视图,最好创建一个子类UITableViewCell并在该子类的方法中添加子视图drawRect:。这样,修改是单元格的一部分,并且不会在每次重用单元格时添加。

于 2013-03-16T14:00:17.813 回答