我正在使用以下代码在UITableView Cell中创建文本字段:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell.showsReorderControl = YES;
}
if (indexPath.row == 1)
{
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(15,10,260,40)];
textField.placeholder = @"Activity 1: Type Name";
textField.delegate = self;
textField.clearButtonMode = YES;
[textField setReturnKeyType:UIReturnKeyDone];
[cell addSubview:textField];
}
return cell;
我以完全相同的方式创建3个textFields。唯一的区别是placeHolder文本。
当键盘弹出时,视图向上滚动,textField 1离开屏幕。返回后,我认为textField正在重新创建。
以下是一些截图:
第一次出现细胞(看起来很棒):
从屏幕滚动后返回(注意第一个文本字段):
在单元格一中,当我开始输入时,第二个创建的textField的placeHolder会消失,但第一个textField的占位符仍然存在:
两个问题:
答案 0 :(得分:2)
我假设此代码位于cellForRow
tableview dataSource协议方法中。问题是这个方法被多次调用(有时你不期望),导致创建一个新的文本字段并添加到同一个单元格。要解决此问题,您只需在创建单元格时添加文本字段,然后在每次调用方法时配置单元格。我建议创建一个表格单元子类,但为了学习目的,您可以将代码更改为:
#define kTextFieldTag 1
UITextField* textField = [cell viewWithTag:kTextFieldTag];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
cell.showsReorderControl = YES;
/* only called when cell is created */
textField = [[UITextField alloc] initWithFrame:CGRectMake(15,10,260,40)];
textField.delegate = self;
textField.clearButtonMode = YES;
textField.tag = kTextFieldTag; /* I would recommend a cell subclass with a textfield member over the tag method in real code*/
[textField setReturnKeyType:UIReturnKeyDone];
[cell addSubview:textField];
}
/* called whenever cell content needs to be updated */
if (indexPath.row == 1)
{
textField.placeholder = @"Activity 1: Type Name";
}
...
/* or replace if checks with with: */
textField.placeholder = [NSString stringWithFormat:@"Activity %i: Type Name", (int)indexPath.row]; /* Handles all fields :) */
...
答案 1 :(得分:0)
我还建议您查看免费的Sensible TableView框架。框架不仅会自动为您创建输入单元格,还会自动将更改应用回您的对象。强烈推荐,节省了大量时间。