如果我在UITableView
中拥有大量帐户。当我滚动UITextFid
时,我在第一个单元格中编辑的UITableView
文本正在重置。由于细胞可重用性,这种情况正在发生。我没有在UITextFid
中将我的UITableView
文本设置为Indexpath处的cellForRow。由于其他实现,我在自定义单元视图中执行此操作。
STTableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:@"STTableViewCell"];
if (cell == nil)
{
cell = [[STTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"STTableViewCell"];
}
cell.accountNameTxtField.delegate = self
// Fetching the URL from Array at index of indexpath.row
OTPAuthURL *url = [self.authURLs objectAtIndex:indexPath.row];
// Sending the generated authURl and token description to custom STTableViewCell to load the data in a tableView
[(STTableViewCell *)cell setAuthURL:url withtokenDesc:nil];
return cell;
答案 0 :(得分:1)
您需要维护一个数组,其中的对象数量等于tableview中的项目数。 每个文本字段都应该有一个等于该行的indexPath.row的标记。 e.g:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:CustomUITableViewCell = tableView.dequeueReusableCell(withIdentifier: "customCell")! as CustomUITableViewCell
cell.textfield = indexPath.row
cell.textfield.delegate = self
cell.textfield.text = arrayTemp[indexPath.row] as String
}
}
使用textfield的委托方法,你将拥有
public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{
arrary[textfield.tag] = textfield.text
}
在textfield委托方法中,您需要将文本保存在temp数组中,其索引等效于textfield的标记
答案 1 :(得分:0)
您需要将输入的文本存储为输入或失去焦点,一旦单元格被回收,信息就会丢失。使用文本域textfieldDidEndEditing
中的委托回调然后当单元格返回视图时,您需要检查文本是否存储在之前并重新填充。
还可以尝试this method来收听编辑活动
答案 2 :(得分:0)
DO 在cellForRowAtIndexPath
中设置值。这就是它的目的。这样做所有这些重复使用的东西就像魅力一样。
我对自定义视图的处理方式是:
在我的自定义视图类中,我创建了一些bind(MyObject myObject)
方法(或bind:(MyObject*)myObject
respecitly)。 bind
方法接收要显示为参数(或多个参数)的对象。
然后bind
方法执行所有自定义内容以显示单元格内的对象,以便视图控制器(已实现cellForRowAtIndexPath
)保持不受任何自定义视图相关内容的限制,但绑定方法。
我每次都在cellForRowAtIndexPath
中调用这种绑定方法。
答案 3 :(得分:0)
看起来一切都按预期工作 - 同时仍然显示该单元格。但是,每当有人从显示屏上消失时,您就会重复使用这些信元,因此信息会丢失。
您需要分离数据模型和显示 - 如果您拥有的只是一个字段的文本,则创建一个String数组(myTableData : [String]
),并在cellForRowAt
中将textfield设置为{{ 1}}
如果需要在表中填充多个字段,则使用所需内容定义结构(或类),并使用其中的数组填充表
答案 4 :(得分:0)
阐述Pankaj的答案。
您可以像这样更新文本设置方法
- (void)setAuthURL:(OTPAuthURL *)authURL withtokenDesc:(NSString *)tokenDesc andTag:(NSInteger)tag
{
self.accountNameTxtField.tag = tag;
self.accountNameTxtField.text = authURL.name;
}
从cellForRowAtIndexPath
方法,而不是简单地设置文字,也可以用它设置标记。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
STTableViewCell *cell;
cell = [tableView dequeueReusableCellWithIdentifier:@"STTableViewCell"];
if (cell == nil)
{
cell = [[STTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"STTableViewCell"];
cell.accountNameTxtField.delegate = self
}
// Fetching the URL from Array at index of indexpath.row
OTPAuthURL *url = [self.authURLs objectAtIndex:indexPath.row];
// Sending the generated authURl and token description to custom STTableViewCell to load the data in a tableView, and setting unique tag for textfield
[(STTableViewCell *)cell setAuthURL:url withtokenDesc:nil andTag:indexPath.row];
return cell;
}
实施UITextFieldDelegate
方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
//Printing log to check tag
NSLog(@"Tag = %ld",textField.tag);
//Update the original array
self.authURLs[textField.tag] = textField.text;
//Dismiss keyboard
[textField resignFirstResponder];
return YES;
}
希望这有帮助!