使用UITextField动态添加UITableViewCell

时间:2011-08-05 20:33:29

标签: iphone xcode uitableview uitextfield

我正在尝试使用UITableView来动态添加和删除行,并且行中包含UITextField。为了添加行,我正在使用代码:

- (void) addRow
    {
        [nameArray addObject:[NSString stringWithFormat:@"%i", x]];
        [self.tableView reloadData];
        x++;
    }

我只是在计算nameArray以获取我在tableView中有多少行。然后,在cellForRowAtIndexPath内部,我有以下代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...
    /*Default Apple-y stuff*/
    ...
    if ([indexPath row] == 0) {
        playerTextFieldZero = [[UITextField alloc] initWithFrame:CGRectMake(20, 10, 185, 30)];
        playerTextFieldZero.adjustsFontSizeToFitWidth = YES;
        playerTextFieldZero.placeholder = @"Name";
        playerTextFieldZero.textColor = [UIColor blackColor];
        playerTextFieldZero.returnKeyType = UIReturnKeyDone;
        playerTextFieldZero.backgroundColor = [UIColor whiteColor];
        playerTextFieldZero.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
        playerTextFieldZero.textAlignment = UITextAlignmentLeft;
        playerTextFieldZero.tag = 0;
        playerTextFieldZero.delegate = self;
        playerTextFieldZero.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
        [playerTextFieldZero setEnabled: YES];
        [cell addSubview:playerTextFieldZero];
        [playerTextFieldZero becomeFirstResponder];
        [playerTextFieldZero release];
    }
    ...
    /*More of those in here*/
    ...
return cell;
}

我有这个代码的多个问题。第一个问题是我正在做预设数量的UITextFields,所以我可以在textFieldShouldReturn中调用它们。我有一个很好的方法来生成UITextFields,当我按下完成键时它会返回吗?

我现在这样做的第二大问题是每次添加新的UITextField都会被清除。知道为什么吗?

1 个答案:

答案 0 :(得分:7)

要解决您的第一个问题,我首先将UITextField创建代码拉入方法中。

- (UITextField*)textFieldForCell:(UITableViewCell*)cell withDelegate:(id<UITextFieldDelegate>*)delegate {
    UITextField textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 10, 185, 30)];
    textField.delegate = self;
    ....
    [cell addSubview:playerTextFieldZero];
    [textField release];
}

然后在tableView中调用new方法:cellForRowAtIndexPath:method ...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    // Custom initialization code    
    [self textFieldForCell:cell withDelegate:self];
}

现在要确保你的UITextField响应返回键实现你的UITextFieldDelegate的textFieldShouldReturn:方法(可能是你的UITableViewController)总是返回true ...

-(bool)textFieldShouldReturn:(UITextField*)textField {
    return YES;
}

至于你的第二个问题,我相信这是直接调用reloadData的结果。这将强制您的UITableView重新创建其单元格。这反过来会重新创建您的UITextFields,然后您将丢失其状态/文本。我认为您的下一个逻辑步骤是引入一个存储每个UITextField状态的模型(NSMutableArray)。您可以在UITextFieldDelegate接收到textFieldShouldReturn消息时将字段文本保存到数组中。