从单元格的文本字段返回空值

发布于 2025-01-04 21:35:59 字数 5074 浏览 0 评论 0原文

我创建了一个带有文本字段的自定义单元格,但无法检索其值。
在我的 tableView 中,有 3 个自定义单元格以及其他默认单元格。
当我尝试这个时:

NSString *string = customCell.textField.text;

我总是得到一个空值...
这是我的代码:

TextFieldCell.m

#import "TextFieldCell.h"

@implementation TextFieldCell

@synthesize label;
@synthesize textField;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        label = [[UILabel alloc] initWithFrame:CGRectZero];
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = UITextAlignmentRight;
        label.textColor = [UIColor blackColor];
        label.font = [UIFont boldSystemFontOfSize:16.0];
        label.adjustsFontSizeToFitWidth = YES;
        label.baselineAdjustment = UIBaselineAdjustmentNone;
        label.numberOfLines = 20;
        [self.contentView addSubview:label];

        textField = [[UITextField alloc] initWithFrame:CGRectZero];
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        textField.backgroundColor = [UIColor clearColor];
        textField.font = [UIFont boldSystemFontOfSize:16.0];
        textField.delegate = self;
        textField.returnKeyType = UIReturnKeyDone;
        [self.contentView addSubview:textField];
    }

    return self;
}

-(void)layoutSubviews
{
    [super layoutSubviews];

    CGRect r = CGRectInset(self.contentView.bounds, 8, 8);
    CGRect r1 = CGRectInset(self.contentView.bounds, 8, 8);

    if (label.text != nil)
    {
        r.size = CGSizeMake(12, 27);
        label.frame = r;

        r1.origin.x += self.label.frame.size.width + 6;
        r1.size.width -= self.label.frame.size.width + 6;
        textField.frame = r1;
    }
    else
    {
        textField.frame = r;
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [textField resignFirstResponder];
    return NO;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
}

@end

表视图数据源

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0)
    {
        if (indexPath.row == 0)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else if (indexPath.row == 1)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else
        {
            return [self defaultCellForTableView:tableView atIndexPath:indexPath];
        }
    }
    else if (indexPath.section == 1)
    {
        if (indexPath.row == 0)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else
        {
            return [self defaultCellForTableView:tableView atIndexPath:indexPath];
        }
    }
    else if (indexPath.section == 2)
    {
        return [self defaultCellForTableView:tableView atIndexPath:indexPath];
    }
    else
    {
        return [self chooseFotoCellForTableView:tableView atIndexPath:indexPath];
    }
}

-(TextFieldCell *)textFieldCellForTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath
{
    static NSString *TextFieldCellIdentifier = @"TextFieldCellIdentifier";

    TextFieldCell *cell = [tableView dequeueReusableCellWithIdentifier:TextFieldCellIdentifier];
    if (cell == nil)
    {
        cell = [[[TextFieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TextFieldCellIdentifier] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    if (indexPath.section == 0)
    {
        if (indexPath.row == 0)
        {
            cell.label.text = nil;
            cell.textField.placeholder = NSLocalizedString(@"Nome", @"");
        }
        else
        {
            cell.label.text = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];
            cell.textField.placeholder = NSLocalizedString(@"Costo", @"");
        }
    }
    else
    {
        cell.label.text = nil;
        cell.textField.placeholder = NSLocalizedString(@"URL", @"");
    }

    return cell;
}

代码检索 TextField 值

TextFieldCell *nomeCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
TextFieldCell *costoCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
TextFieldCell *linkCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

NSLog(@"nomeCell textField = %@", nomeCell.textField.text);
NSLog(@"costoCell textField = %@", costoCell.textField.text);
NSLog(@"linkCell textField = %@", linkCell.textField.text);

我尝试记录 nomeCell、costoCell 和 linkCell,它们已正确分配和初始化,并且我在这里没有使用 ARC...
谁能帮我吗?
太感谢了!

I've created a custom cell with a textField but I'm not able to retrieve its value.
In my tableView, there are 3 of these custom cells, together with other default cells.
When I try this:

NSString *string = customCell.textField.text;

I always get a null value...
This is my code:

TextFieldCell.m

#import "TextFieldCell.h"

@implementation TextFieldCell

@synthesize label;
@synthesize textField;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self)
    {
        label = [[UILabel alloc] initWithFrame:CGRectZero];
        label.backgroundColor = [UIColor clearColor];
        label.textAlignment = UITextAlignmentRight;
        label.textColor = [UIColor blackColor];
        label.font = [UIFont boldSystemFontOfSize:16.0];
        label.adjustsFontSizeToFitWidth = YES;
        label.baselineAdjustment = UIBaselineAdjustmentNone;
        label.numberOfLines = 20;
        [self.contentView addSubview:label];

        textField = [[UITextField alloc] initWithFrame:CGRectZero];
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        textField.backgroundColor = [UIColor clearColor];
        textField.font = [UIFont boldSystemFontOfSize:16.0];
        textField.delegate = self;
        textField.returnKeyType = UIReturnKeyDone;
        [self.contentView addSubview:textField];
    }

    return self;
}

-(void)layoutSubviews
{
    [super layoutSubviews];

    CGRect r = CGRectInset(self.contentView.bounds, 8, 8);
    CGRect r1 = CGRectInset(self.contentView.bounds, 8, 8);

    if (label.text != nil)
    {
        r.size = CGSizeMake(12, 27);
        label.frame = r;

        r1.origin.x += self.label.frame.size.width + 6;
        r1.size.width -= self.label.frame.size.width + 6;
        textField.frame = r1;
    }
    else
    {
        textField.frame = r;
    }
}

-(BOOL)textFieldShouldReturn:(UITextField *)aTextField
{
    [textField resignFirstResponder];
    return NO;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
}

@end

Table View Data Source

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.section == 0)
    {
        if (indexPath.row == 0)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else if (indexPath.row == 1)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else
        {
            return [self defaultCellForTableView:tableView atIndexPath:indexPath];
        }
    }
    else if (indexPath.section == 1)
    {
        if (indexPath.row == 0)
        {
            return [self textFieldCellForTableView:tableView atIndexPath:indexPath];
        }
        else
        {
            return [self defaultCellForTableView:tableView atIndexPath:indexPath];
        }
    }
    else if (indexPath.section == 2)
    {
        return [self defaultCellForTableView:tableView atIndexPath:indexPath];
    }
    else
    {
        return [self chooseFotoCellForTableView:tableView atIndexPath:indexPath];
    }
}

-(TextFieldCell *)textFieldCellForTableView:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath
{
    static NSString *TextFieldCellIdentifier = @"TextFieldCellIdentifier";

    TextFieldCell *cell = [tableView dequeueReusableCellWithIdentifier:TextFieldCellIdentifier];
    if (cell == nil)
    {
        cell = [[[TextFieldCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TextFieldCellIdentifier] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    if (indexPath.section == 0)
    {
        if (indexPath.row == 0)
        {
            cell.label.text = nil;
            cell.textField.placeholder = NSLocalizedString(@"Nome", @"");
        }
        else
        {
            cell.label.text = [[NSLocale currentLocale] objectForKey:NSLocaleCurrencySymbol];
            cell.textField.placeholder = NSLocalizedString(@"Costo", @"");
        }
    }
    else
    {
        cell.label.text = nil;
        cell.textField.placeholder = NSLocalizedString(@"URL", @"");
    }

    return cell;
}

Code To Retrieve TextField Value

TextFieldCell *nomeCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
TextFieldCell *costoCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]];
TextFieldCell *linkCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];

NSLog(@"nomeCell textField = %@", nomeCell.textField.text);
NSLog(@"costoCell textField = %@", costoCell.textField.text);
NSLog(@"linkCell textField = %@", linkCell.textField.text);

I tried to log nomeCell, costoCell and linkCell and they are correctly allocated and initialized and I'm not using ARC here...
Can anyone help me?
Thank you so much!

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

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

发布评论

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

评论(3

掩饰不了的爱 2025-01-11 21:35:59

我假设当您尝试检索值时,您实际上已经在文本字段中输入了一些文本,并且您正在检索值以更新数据模型,而不是依赖表视图/单元格来存储数据?

不要通过调用表视图控制器的 tableView:cellForRowAtIndexPath: 来获取当前单元格。仅当表视图需要新单元格时才应调用此方法。

直接在表格视图上调用 cellForRowAtIndexPath: 方法。而不是这样:

TextFieldCell *nomeCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

这样做:

TextFieldCell *nomeCell = (TextFieldCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

I assume that you have actually entered some text in the text field by the time you are trying to retrieve the values, and you are retrieving the values to update your data model rather than relying on the table view / cells to store your data?

Don't obtain the current cell by calling your table view controller's tableView:cellForRowAtIndexPath:. This should only be called by the table view when it needs a new cell.

Call the cellForRowAtIndexPath: method on the table view directly. Instead of this:

TextFieldCell *nomeCell = (TextFieldCell *)[self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];

Do this:

TextFieldCell *nomeCell = (TextFieldCell *)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
横笛休吹塞上声 2025-01-11 21:35:59

您正在将文本分配给 placeholder 属性,并且正在记录 textField.text

You are assigning text to placeholder property and you are logging textField.text.

简美 2025-01-11 21:35:59
textField = [[UITextField alloc] initWithFrame:CGRectZero];
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        textField.backgroundColor = [UIColor clearColor];
        textField.font = [UIFont boldSystemFontOfSize:16.0];
        textField.delegate = self;

        //added
        textField.tag = 101;

        textField.returnKeyType = UIReturnKeyDone;
        [self.contentView addSubview:textField];

检索文本字段值的代码:

//fetch cell for which you want to get textfield then,
TextFieldCell *nomeCell = (TextFieldCell *)[cell.contentView viewWithTag:101];
textField = [[UITextField alloc] initWithFrame:CGRectZero];
        textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
        textField.backgroundColor = [UIColor clearColor];
        textField.font = [UIFont boldSystemFontOfSize:16.0];
        textField.delegate = self;

        //added
        textField.tag = 101;

        textField.returnKeyType = UIReturnKeyDone;
        [self.contentView addSubview:textField];

Code To Retrieve TextField Value:

//fetch cell for which you want to get textfield then,
TextFieldCell *nomeCell = (TextFieldCell *)[cell.contentView viewWithTag:101];
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文