自定义单元格文本字段索引在滚动时发生变化
Custom Cell Textfield index changing on Scrolling
我在自定义单元格中有一个 UITextField
。一旦我在第一个和第二个单元格中输入了值,当我滚动时 UITableView
文本字段索引正在更改(第一个单元格值更改为最后一个单元格)。谁能帮我解决我的问题?
这是我的代码:
static NSString *cellIdentifier = @"TableCellID";
CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[CustomTableViewCell alloc] init]; // or your custom initialization
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.txt_TCelltext.tag=indexPath.row;
cell.txt_TCelltext.placeholder=@"0.00";
[cell.txt_TCelltext setDelegate:self];
如果单元格是新创建的,则将占位符/文本分配给文本字段。 但是如果相同的单元格被重复使用,并且对于重复使用的单元格,您没有将占位符/文本分配给当前索引路径的数据源中的文本字段,而不是文本字段将显示先前索引的数据新创建单元格的路径。因此,要解决您的问题,您需要根据当前索引路径的文本将文本分配给文本字段,而不管单元格是新创建的还是重新使用的。
要解决此问题,您有两个选择-
1) 使用当前索引路径的文本字段的数据更新可重用单元格文本字段的内容
2) 如果是可重复使用的单元格,请释放先前的文本字段并创建一个新文本字段,并使用当前行的数据进行初始化。
第二种方法涉及一些开销,所以我建议您使用第一种方法解决您的问题。
使用第一种方法的示例代码-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor=[UIColor clearColor];
UITextField *textField = nil;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
}
// assign placeholder text to text field
[cell.textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];
return cell;
}
使用第二种方法的示例代码-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor=[UIColor clearColor];
UITextField *textField = nil;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
}
textField = [[cell contentView] viewWithTag:indexPath.row];
if(textField ! = nil)
[textField removeFRomSuperView];
textField = [[UITextField alloc] initWithFrame:CGRectZero];
// customize text filed
// assign placeholder text to text field
[textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];
[textField setTag:indexPath.row]; // set tag on text field
[[cell contentView] addSubview:textField];
[textField release];
return cell;
}
注意:上面的示例代码只是一个粗略的想法,请使用上面的源码/根据您的要求进行定制。
static NSString *cellIdentifier = @"TableCellID";
in place of this line
use NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row];
是因为小区复用。尝试从字典(或)数组中填充 UITextField
数据。试试这个:
- (UITableViewCell *)tableView:(UITableView *)tableViewLocal
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Your Code
UITextField *textField = [[UITextField alloc]init];
textField.delegate = self;
textField.tag = indexPath.row;
if ([myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]])
{
textField.text = [[myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];
}
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
[myTextFieldDictionary setValue:textField.text
forKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];
}
在下面的函数中放置一个断点,您可以看到每次单元格变得可见时它都会被调用,因此您在该函数中的代码会重置文本字段中的文本。如果有什么事情让你震惊,不要等待!你可以用自己的代码解决它。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
您可以在索引路径处的行的 Viewdidload 和单元格中编写以下代码。
arrCells = [NSMutableArray new];
for (int i = 0; i < [[dic_demo objectForKey:@"Demo"] count]; i++) {
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil];
CustomTableViewCell *cell = [objects objectAtIndex:0];
[arrCells addObject:cell];
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CustomTableViewCell *cell = [arrCells objectAtIndex:indexPath.row];
}
希望对您有所帮助
我在自定义单元格中有一个 UITextField
。一旦我在第一个和第二个单元格中输入了值,当我滚动时 UITableView
文本字段索引正在更改(第一个单元格值更改为最后一个单元格)。谁能帮我解决我的问题?
这是我的代码:
static NSString *cellIdentifier = @"TableCellID";
CustomTableViewCell *cell = (CustomTableViewCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[CustomTableViewCell alloc] init]; // or your custom initialization
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.txt_TCelltext.tag=indexPath.row;
cell.txt_TCelltext.placeholder=@"0.00";
[cell.txt_TCelltext setDelegate:self];
如果单元格是新创建的,则将占位符/文本分配给文本字段。 但是如果相同的单元格被重复使用,并且对于重复使用的单元格,您没有将占位符/文本分配给当前索引路径的数据源中的文本字段,而不是文本字段将显示先前索引的数据新创建单元格的路径。因此,要解决您的问题,您需要根据当前索引路径的文本将文本分配给文本字段,而不管单元格是新创建的还是重新使用的。
要解决此问题,您有两个选择-
1) 使用当前索引路径的文本字段的数据更新可重用单元格文本字段的内容
2) 如果是可重复使用的单元格,请释放先前的文本字段并创建一个新文本字段,并使用当前行的数据进行初始化。
第二种方法涉及一些开销,所以我建议您使用第一种方法解决您的问题。
使用第一种方法的示例代码-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor=[UIColor clearColor];
UITextField *textField = nil;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
}
// assign placeholder text to text field
[cell.textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];
return cell;
}
使用第二种方法的示例代码-
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
cell.backgroundColor=[UIColor clearColor];
UITextField *textField = nil;
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"cell"];
}
textField = [[cell contentView] viewWithTag:indexPath.row];
if(textField ! = nil)
[textField removeFRomSuperView];
textField = [[UITextField alloc] initWithFrame:CGRectZero];
// customize text filed
// assign placeholder text to text field
[textFiled setPlaceholder:[textFiledTextsArray objectAtIndex:indexPath.row]];
[textField setTag:indexPath.row]; // set tag on text field
[[cell contentView] addSubview:textField];
[textField release];
return cell;
}
注意:上面的示例代码只是一个粗略的想法,请使用上面的源码/根据您的要求进行定制。
static NSString *cellIdentifier = @"TableCellID";
in place of this line
use NSString *cellIdentifier = [NSString stringWithFormat:@"Cell_%d_%d", indexPath.section, indexPath.row];
是因为小区复用。尝试从字典(或)数组中填充 UITextField
数据。试试这个:
- (UITableViewCell *)tableView:(UITableView *)tableViewLocal
cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Your Code
UITextField *textField = [[UITextField alloc]init];
textField.delegate = self;
textField.tag = indexPath.row;
if ([myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]])
{
textField.text = [[myTextFieldDictionary objectForKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];
}
}
-(void)textFieldDidEndEditing:(UITextField *)textField
{
[myTextFieldDictionary setValue:textField.text
forKey:[NSString stringWithFormat:@"%ld", (long)textField.tag]];
}
在下面的函数中放置一个断点,您可以看到每次单元格变得可见时它都会被调用,因此您在该函数中的代码会重置文本字段中的文本。如果有什么事情让你震惊,不要等待!你可以用自己的代码解决它。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
您可以在索引路径处的行的 Viewdidload 和单元格中编写以下代码。
arrCells = [NSMutableArray new];
for (int i = 0; i < [[dic_demo objectForKey:@"Demo"] count]; i++) {
NSArray *objects = [[NSBundle mainBundle] loadNibNamed:@"CustomTableViewCell" owner:self options:nil];
CustomTableViewCell *cell = [objects objectAtIndex:0];
[arrCells addObject:cell];
}-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CustomTableViewCell *cell = [arrCells objectAtIndex:indexPath.row];
}
希望对您有所帮助