1

我正在尝试创建一个注册表单,其中包含大约 20 个不同的字段,分为四个不同的部分。我为此创建了一个自定义单元格,其中包含一个标签和一个 UITextField,并且我的 tableview 上有一个字典数组,指示标签的名称应该是什么,以及 texftield 的标签(因为根据我使用 UIPicker 输入数据的标签)。

问题是,当我开始编辑字段时,向下滚动和备份所有内容都会变得混乱,并且在字段上更改它不应该......我发现这显然正在发生,因为我正在对单元格进行出队所以它是创建重复的引用,所以我每次都尝试创建一个新单元格,但这不起作用,因为它只会用我需要的确切数量的单元格初始化一个表格视图,但里面只有没有内容(标签或文本字段)的空白单元格.

考虑到按下按钮时我必须检索它们的值这一事实,最简单的方法是什么,这样我就可以为每个单元格保留不同的内存引用?

我已经阅读了这篇文章的建议,但仍然不知道如何创建一个单元格数组。

有什么帮助吗?

这是我的定义的代码:

NSArray *section1 = [[NSArray alloc] initWithObjects:
                     [NSDictionary dictionaryWithObjectsAndKeys:@"100",@"tag",@"Title",@"title",@"title",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"First Name",@"title",@"first_name",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Last Name",@"title",@"last_name",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Job Title",@"title",@"job_title",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Email",@"title",@"email",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Email",@"title",@"confirm_email",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Password",@"title",@"password",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Confirm Password",@"title",@"conf_password",@"fieldName",nil],
                     [NSDictionary dictionaryWithObjectsAndKeys:@"0",@"tag",@"Phone",@"title",@"phone",@"fieldName",nil],
                     nil];

....

self.formItems = [[NSArray alloc] initWithObjects:
                  section1,
                  section2,
                  section3,
                  section4,
                  section5,
                  nil];

然后我在 cellForRowAtIndexPath 上使用的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"freeTrialFormCell";
    TSIFreeTrialFormCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section];
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row];

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) {
        cell.textField.secureTextEntry = YES;
    }

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"];
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"];
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue];
    cell.label.text = [myFieldInfo objectForKey:@"title"];

    return cell;
}
4

2 回答 2

0

UITableView 在您上下滚动时重用单元格,因此您将丢失仅输入该单元格的信息。我所做的是创建一个数组来保存这些单元格的输入。

基本上:

enteredText = [[NSMutableArray alloc] init]; //iVar, not local variable
for (int i=0; i<numTableRows; i++) {
   [enteredText addObject:@""]; //fill with dummy values that you will replace as user types
}

然后在您的表格视图文本字段中,将自己设置为文本字段的代表并实现textFieldDidEndEditing. 在该方法中,将该行的值替换enteredText为用户的文本。

制作单元格时,将文本字段文本设置为数组中的值:

myCell.textField.text = [enteredText objectAtIndex:indexPath.row];

一开始它是空白的,然后在用户放东西后会保留用户的文本。

于 2012-11-29T16:20:26.670 回答
0
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
        TSIFreeTrialFormCell *cell = [[TSIFreeTrialFormCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"] autorelease];

    NSArray* sectionData = [self.formItems objectAtIndex:indexPath.section];
    NSDictionary* myFieldInfo = [sectionData objectAtIndex:indexPath.row];

    if ([[myFieldInfo objectForKey:@"fieldName"] rangeOfString:@"password"].location != NSNotFound) {
        cell.textField.secureTextEntry = YES;
    }

    cell.fieldName = [myFieldInfo objectForKey:@"fieldName"];
    cell.textField.placeholder = [myFieldInfo objectForKey:@"title"];
    cell.textField.tag = [[myFieldInfo objectForKey:@"tag"] integerValue];
    cell.label.text = [myFieldInfo objectForKey:@"title"];

    return cell;
}

但这会影响性能,因为您正在为每一行创建单元格

于 2012-11-29T15:50:13.927 回答