在表格单元格中获取/设置 UITextField 值

Posted

技术标签:

【中文标题】在表格单元格中获取/设置 UITextField 值【英文标题】:Getting/Setting UITextField value in a table cell 【发布时间】:2011-02-03 08:02:44 【问题描述】:

对于我当前的项目,我需要一个表格,其中包含每个单元格中的文本字段,单元格和文本字段的数量必须是动态的,这取决于 MutuableArray 中的数据数量。我有单元格中的文本字段工作,但我无法获取/设置文本字段值。我想知道你们是否可以帮助我或者至少纠正我做错了什么?非常感谢。参见下面的代码 sn-ps:

// Adds textfield into cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
        NSUInteger row = indexPath.row;
        X10ArchiefIndexDefs *curIndex = [indexDefinities objectAtIndex:row];
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

        BOOL bShowSelection = ([curIndex.HasVasteWaarden isEqualToString:@"false"]);

        if (bShowSelection) 
            bShowSelection = !([curIndex.DataType isEqualToString:@"Datum"]);
        

        if ([indexPath section] == 0) 
            if (bShowSelection) 
                cell.accessoryType = UITableViewCellAccessoryNone;
             else 
                cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
            

            UITextField *editField = [[UITextField alloc] initWithFrame:CGRectMake(110, 10, 185, 30)];
            editField.adjustsFontSizeToFitWidth = YES;
            editField.textColor = [UIColor blackColor];
            editField.placeholder = curIndex.Naam;
            editField.keyboardType = UIKeyboardTypeDefault;
            editField.returnKeyType = UIReturnKeyNext;
            editField.backgroundColor = [UIColor whiteColor];
            editField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support
            editField.autocapitalizationType = UITextAutocapitalizationTypeNone; // no auto capitalization support
            editField.textAlignment = UITextAlignmentLeft;
            editField.clearButtonMode = UITextFieldViewModeNever; // no clear 'x' button to the right
            editField.tag = [curIndex.UID intValue];

            [editField setEnabled: YES];
            [cell addSubview:editField];

            [editField release];
        
    

    return cell;

在某些情况下,我使用 popovercontroller 来显示数据列表。用户可以选择弹出窗口的值。 This code is executed when there is a value selected:

- (void)selectedValue:(NSString *) value 

    //---update value of the text field ---
    //The first attempt it doesn't put the text to text field

    //static NSString *CellIdentifier = @"Cell";
    //UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    //
    //if (cell == nil) 
    //  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    //

    // second attempt it crashes 
    X10ArchiefIndexDefs *curIndex = [indexDefinities objectAtIndex:curRow.row];
    int index = [curIndex.UID intValue];
    UITextField *textField = (UITextField *) [curCell viewWithTag: index];
    if (textField) 
            [textField setText:value];
    

    [textField release];

    [self.popOverController dismissPopoverAnimated:YES];

当单元格被选中时,我会确保该单元格被保存以供以后使用。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    X10ArchiefIndexDefs *curIndex = [indexDefinities objectAtIndex:indexPath.row];

    if (!curIndex) 
        return;
    

    curRow = indexPath; // saves the selected row

    if ([curIndex.VasteWaarden count] > 0) 
        UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
        curCell = cell; // saves the selected cell

        CGRect frame = [cell.superview convertRect:cell.frame toView:self.view];

        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];          
        detailViewController.delegate = self;
        self.popOverController = [[[UIPopoverController alloc] initWithContentViewController:detailViewController] autorelease];               

        X10ArchiefIndexDefs *curIndex = [indexDefinities objectAtIndex:indexPath.row];
        self.detailViewController.Values = curIndex.VasteWaarden;

        [self.popOverController presentPopoverFromRect:frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    

再次提前感谢您。

干杯, 油井

【问题讨论】:

【参考方案1】:

在第二个代码 sn-p 中,您将释放 textField。你不应该这样做,因为你没有保留它。因为viewWithTag: simple 获得对文本字段的引用,所以它不保留文本字段。因此,您释放它的次数超过了它被保留的次数,因此 retainCount 达到 0 并且文本字段从内存中释放。然后,当您第二次尝试时,内存中没有文本字段。

只需删除:

[textField release];

从第二个代码sn-p。如果您不明白为什么,请阅读一些有关内存管理的文章(只需 google 即可)。完全理解它需要一些时间,至少我知道我花了一些时间:)

【讨论】:

非常感谢您的快速回复。我删除了这个,现在它工作得很好。 :)

以上是关于在表格单元格中获取/设置 UITextField 值的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何从 tableview 的自定义单元格中的 UITextField 访问值

自定义表格视图单元格中的 UITextField。点击单元格/文本字段时显示选择器视图

在 UIViewController 的自定义表格单元格中的 UITextField 上成为 NextResponder

如何使表格单元格中的 UITextField 成为第一响应者?

按下按钮时在 UITableView 单元格中清除 UITextField 的文本

快速滚动ios时自定义单元格中的UITextField值出现问题