【问题标题】:How to refresh reusable cells in iOS 5?如何在 iOS 5 中刷新可重复使用的单元格?
【发布时间】:2011-11-29 19:56:12
【问题描述】:

我正在情节提要中使用标识符“TextCell”构建一个自定义单元格。它是一个平面单元格,但是通过代码,我向每个单元格添加了一个文本字段,因为我可以拥有“n”个单元格,因此用户可以在每个单元格中插入文本。我的问题是我创建的文本字段似乎在另一个之上一遍又一遍地创建自己。我可以这样说,因为我有一个占位符文本,它变得越来越暗。

我也在使用 ARC。请您提供的任何见解对我有很大帮助。

我附上了将文本字段添加到单元格的函数代码:

UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"TextCell"];


//create text field inside cell and init it with the default settings
UITextField * textHolder = [[UITextField alloc] initWithFrame:CGRectMake(18, 10, 300, 44)];
[textHolder setPlaceholder:[cellsText objectAtIndex:indexPath.row]];
//[textHolder setValue:[UIColor blackColor] forKeyPath:@"_placeholderLabel.textColor"];
[textHolder setFont:[UIFont fontWithName:@"HelveticaNeue-Regular" size:16]];
[textHolder setTextColor:[UIColor blackColor]];
[textHolder setTextAlignment:UITextAlignmentLeft];
textHolder.tag = FIELD_PREFIX + indexPath.row;
[textHolder setDelegate:self];

[[NSBundle mainBundle] loadNibNamed:@"accessoryView" owner:self options:nil];
[textHolder setInputAccessoryView:accessoryView];
[cell addSubview:textHolder];    

//set keyboard to type passwords    
[textHolder setSecureTextEntry:YES];    

【问题讨论】:

    标签: iphone uitableview ios5


    【解决方案1】:

    每次重复使用单元格时,您都会将另一个 UITextField 添加到预先存在的文本字段集中。你有两个选择:

    1) 将文本字段放在情节提要的自定义表视图单元格中,而不是手动创建。通过使用UITableViewCell 的自定义子类,您还可以将文本字段分配给自定义子类中的属性。这有一个额外的好处,您可以在单元格中添加一堆其他的东西。然后,您可以访问该属性,而不是创建新的文本字段。

    2) 在创建新文本字段之前删除“旧”文本字段。您可能必须在所有子视图中搜索 UITextField 的实例才能实现此目的,因为您已经将标记值用于其他内容。

    第一个绝对是更干净的版本。

    【讨论】:

    • 我正在尝试第一个选项,它看起来很不错,但它给我带来了一些麻烦,因为故事板中的文本字段意味着它有一个静态标签,所以我无法通过textfied when 是第一响应者的标签(这有助于我使用键盘滚动)。 second 选择更适合我,但由于我使用的是 ARC,我不太清楚如何删除“旧”文本字段。如果你能帮我解决这个问题,那将意义重大。感谢您迄今为止的所有帮助。
    • On 1:只要您使用UITableViewCell 的自定义子类,您就应该能够将您的文本字段链接到IBOutlet。当您将该类设置为您的表格视图单元s class, you should be able do Command-Drag the text field to your .h file to create the property, no tags needed. You can then handle everything though your subclasses' property. On 2: You need to find the UITextField` 时,通过查看子视图并将其从超级视图 (removeFromSuperview) 中删除。如果您没有对文本字段的进一步引用,则应自动将其释放。
    • 谢谢@TriPhoenix!!!就是这样!我使用了第一个建议,效果很好。我对单元进行了子类化并在那里创建了 IBOUTLET。我使用link 中的知识来制作自定义子类,但如果没有你的帮助,我是做不到的。
    【解决方案2】:

    您不应该将文本字段添加到视图中,而应该将它们添加到内容视图中:

    [cell.contentView addSubview:textHolder];
    

    希望对你有帮助。

    【讨论】:

    • 嘿,谢谢!!!这是问题的一部分,但它并没有完全解决它,我有点菜鸟,我在正确声明单元格时遇到了一些问题。 @NullSleep
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多