iphone - 在自定义 UITableViewCell 中访问 UITextField

标签 iphone objective-c ios uitableview

我在 IB 中创建了一个 UITableViewCell(与关联的 UITableViewCell 子类 .m 和 .h),其中包含一个 UITextField。此 UITextField 连接到 UITableViewCell 子类中的 IBOutlet,并且还具有一个属性。在我的 TableView Controller 中,我使用带有以下代码的自定义单元格:

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"textfieldTableCell"];
    if (cell == nil) {
        // Create a temporary UIViewController to instantiate the custom cell.
        UIViewController *temporaryController = [[UIViewController alloc] initWithNibName:@"TextfieldTableCell" bundle:nil];
        // Grab a pointer to the custom cell.
        cell = (TextfieldTableCell *)temporaryController.view;  
        // Release the temporary UIViewController.
        [temporaryController release];
    }

    return cell;

}

UITextField 显示正常,按预期单击时键盘弹出,但如何访问(获取 .text 属性)每行包含的 UITextField?以及如何处理 UITextFields 的“textFieldShouldReturn”方法?

最佳答案

我认为 OP 试图了解的是一旦用户将数据输入到每个字段后如何访问 UITextField 值。这在按照@willcodejavaforfood 的建议创建单元格时不可用。

我一直在实现一个表单,并试图让它尽可能对用户友好。这是可行的,但请注意,它可能会变得非常复杂,具体取决于您拥有的 UITableViewCells/UITextFields 的数量。

首先针对您的问题:访问 UITextField 的值:

1) 让你的 View Controller 成为 <UITextFieldDelegate>

2) 实现以下方法:

- (void) textFieldDidEndEditing:(UITextField *)textField {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(CustomCell*)[[textField superview] superview]]; // this should return you your current indexPath

        // From here on you can (switch) your indexPath.section or indexPath.row
        // as appropriate to get the textValue and assign it to a variable, for instance:
    if (indexPath.section == kMandatorySection) {
        if (indexPath.row == kEmailField) self.emailFieldValue = textField.text;
        if (indexPath.row == kPasswordField) self.passwordFieldValue = textField.text;
        if (indexPath.row == kPasswordConfirmField) self.passwordConfirmFieldValue = textField.text;
    }
    else if (indexPath.section == kOptionalSection) {
        if (indexPath.row == kFirstNameField) self.firstNameFieldValue = textField.text;
        if (indexPath.row == kLastNameField) self.lastNameFieldValue = textField.text;
        if (indexPath.row == kPostcodeField) self.postcodeFieldValue = textField.text;
    }   
}

我还使用类似的语法来确保当前编辑的字段可见:

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    CustomCell *cell = (CustomCell*) [[textField superview] superview];
    [self.tableView scrollToRowAtIndexPath:[self.tableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
}

最后,您可以处理 textViewShouldReturn:以类似的方式:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(CustomCell*)[[textField superview] superview]];
    switch (indexPath.section) {
        case kMandatorySection:
        {
            // I am testing to see if this is NOT the last field of my first section
            // If not, find the next UITextField and make it firstResponder if the user
            // presses ENTER on the keyboard
            if (indexPath.row < kPasswordConfirmField) {
                NSIndexPath *sibling = [NSIndexPath indexPathForRow:indexPath.row+1 inSection:indexPath.section];
                CustomCell *cell = (CustomCell*)[self.tableView cellForRowAtIndexPath:sibling];
                [cell.cellTextField becomeFirstResponder];
            } else {
                // In case this is my last section row, when the user presses ENTER, 
                // I move the focus to the first row in next section
                NSIndexPath *sibling = [NSIndexPath indexPathForRow:kFirstNameField inSection:kOptionalSection];
                MemberLoginCell *cell = (MemberLoginCell*)[self.memberTableView cellForRowAtIndexPath:sibling];
                [cell.cellTextField becomeFirstResponder];
            }
            break;
        }           
        ...
}

关于iphone - 在自定义 UITableViewCell 中访问 UITextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4375442/

相关文章:

ios - GPUImage锁定 View

ios - 找不到添加 UIBarButtonItem 的位置

ios - 自定义 View Controller 展示导致导航栏弹跳

ios - 如何在 IOS 7 中实现 UIViewController 与前后过渡的导航?

ios - iOS 9 黑屏

iphone - 如何在 applicationDidBecomeActive 之前更新屏幕?

iphone - 什么时候使用NSArray的各种排序方法?

iphone - 从iPhone上的远程sql表获取数据

ios - UICollectionViewCell 随机隐藏

ios - 如何在处理通知时禁止 OneSignal 打开 WebView