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

发布于 2024-10-15 19:32:12 字数 4422 浏览 1 评论 0原文

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

// 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 来显示数据列表。用户可以选择弹出窗口的值。当选择一个值时执行此代码:

- (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];
    }
}

再次非常感谢。

干杯, 伊诺尔

For my current project i need to have a table in which contains textfield in each cell, the number of cells and textfield must be dynamic, it's depends on the number of data in a MutuableArray. I have the textfield in cells working, but i can't get/set the textfield value. I wonder if you guys can help me out or at least correct me what I did wrong? Thank's alot in advance. See code snippets below:

// 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;
}

In some case i'm using popovercontroller to display list of data. User can select a value uit of the popup. 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];
}

When cell is selected I'm making sure that the cell is saved for use later.

- (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];
    }
}

Again thank's alot in advance.

Cheers,
Inoel

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

怪异←思 2024-10-22 19:32:12

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

删除

[textField release];

只需从第二个代码片段中 :即可。如果你不明白为什么,那么阅读一些关于内存管理的文章(只需谷歌一下)。完全理解它需要一些时间,至少我知道我花了一段时间:)

In the second code snippet you are releasing the textField. You shouldn't do this because you haven't retained it. Because viewWithTag: simple gets a reference to the text field it doesn't retain the textField. So you are releasing it more times that it has been retained, so the retainCount reaches 0 and the textfield is dealloced from memory. Then when you attempt it the second time there is no textfield in the memory.

Just remove the:

[textField release];

From the second code snippet. If you don't understand why, then read some articles about memory management (just google it). It takes some time to understand it fully, at least I know it took me a while :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文