Ios 滚动时在UITableView中重复的文本字段值
类似的问题已经问过很多次了,也提到过很多解决方案,但没有一个对我有效,因为它们涉及固定数量的单元格,而我有动态数量的单元格。问题是: 它在Objective-C中。我有一个动态行数的tableview,用户可以根据需要添加更多单元格或删除单元格,每行包含3个文本字段,最后我想从这些文本字段中获取数据并保存它们。从所有文本字段中获取数据工作得很好,但当我将数据添加到任何第3行文本字段中时,当我滚动它时,它会重复,这是一个主要问题 以下是代码:Ios 滚动时在UITableView中重复的文本字段值,ios,objective-c,uitableview,uitextfield,Ios,Objective C,Uitableview,Uitextfield,类似的问题已经问过很多次了,也提到过很多解决方案,但没有一个对我有效,因为它们涉及固定数量的单元格,而我有动态数量的单元格。问题是: 它在Objective-C中。我有一个动态行数的tableview,用户可以根据需要添加更多单元格或删除单元格,每行包含3个文本字段,最后我想从这些文本字段中获取数据并保存它们。从所有文本字段中获取数据工作得很好,但当我将数据添加到任何第3行文本字段中时,当我滚动它时,它会重复,这是一个主要问题 以下是代码: -(void)textFieldDidEndEditi
-(void)textFieldDidEndEditing:(UITextField *)textField{
if ([_txtNumbers resignFirstResponder]) {
totalIndex = [_txtNumbers.text integerValue];
[_tblContacts reloadData];
}
}
- (IBAction)onAddCellClicked:(id)sender {
totalIndex = [_txtNumbers.text integerValue];
totalIndex = totalIndex + 1;
_txtNumbers.text = [NSString stringWithFormat:@"%ld",(long)totalIndex];
[_tblContacts reloadData];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return totalIndex;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"InviteEmailTableViewCell";
InviteEmailTableViewCell *cell = [self.tblContacts dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
cell.txtName.delegate = self;
cell.txtTell.delegate = self;
cell.txtEmail.delegate = self;
UIToolbar *numberToolbar = [[UIToolbar alloc]initWithFrame:CGRectMake(0, 0, 320, 50)];
[numberToolbar setTintColor:kShadowColor1];
[numberToolbar setBarTintColor:[UIColor blackColor]];
numberToolbar.items = [NSArray arrayWithObjects:
[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(cancelNumberPad:)],
[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil],
[[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:@selector(doneWithNumberPad:)],
nil];
cell.txtTell.inputAccessoryView = numberToolbar;
[cell.txtName setTag:indexPath.row];
[cell.txtTell setTag:indexPath.row];
[cell.txtEmail setTag:indexPath.row];
return cell;
}
接下来要做什么?随着文本字段被重用,很明显输入的值将被重复 解决方案: 创建一个数组以保留每个单元格/行的数据,行数=array.count。 保留每个textfield的委托-在每个textfield的textfielddidediting方法中,将数据保存在数组中。 在CellForRowatineXpath方法中,对于每个单元格的每个textfield,从给定indexpath的数组中获取数据,并为该textfield设置相关值。
正如其他人所提到的,您的tableview单元格和文本字段都被重用。由于这些文本字段不会被销毁和重新创建,因此必须手动重置这些字段的状态 您的数据源应该负责管理视图状态 正如Mehul在他的回答中提到的,保留一个数据源来存储在textfield中键入的文本,使用textfield标记indexPath.row可能会有所帮助,而在cellForRowAtIndexPath中,使用数据源更新这些textfield的文本
这种方法确保了视图和数据源之间的同步。重用问题。这些应该会有帮助,在自定义单元格类中重写tableview单元格的perpareForReuse方法,并重置此方法中的textfields falues。@vivekDas感谢您的响应,这是在objC中,我尝试过重写它,但没有成功。如果您能告诉我如何在objC中执行此操作,这将非常有帮助。您迄今为止为perpareForReuse所做的尝试将显示谢谢你的回答,但我还是很困惑,因为我尝试了很多东西,所以可能是因为困惑,我无法注意到你到底在说什么。如果可能的话,你能告诉我要遵循的步骤吗?我知道您已经编写了步骤,但我不清楚对不起。首先了解您的问题,为什么会出现此问题。你知道这行“dequeueReusableCellWithIdentifier”是什么意思吗?它只是意味着——将被隐藏的单元格将再次被重用。所以,很明显,您已经填充的textfield值将被重复。所以,您不能依赖tableview来存储数据。所以,你必须创建一个数组来保存数据。所以我应该将数据保存到textfielddidediting中的数组中,对吗?您提到将委托添加到textfielddidediting中,那么我是否应该将其从cellforrowatinedexpath中删除?当前委托非常好。。我只是告诉你-1。每当任何textfild的值发生更改时—将新值保存到数组中,2。在cellForRowAtIndexPath方法中,从数组中获取相应的值并设置到相关的textfield中。是的,我理解,但情况是我在单元格中有3个textfield,单元格的数量可以增加或减少。@Mr.Desai:您可以根据您增加或减少的单元格来增加或减少更新数组。