UITextfield 值已成功更新,但未显示在表格中

Posted

技术标签:

【中文标题】UITextfield 值已成功更新,但未显示在表格中【英文标题】:UITextfield value successfully updated, but not shown in table 【发布时间】:2015-07-31 16:18:21 【问题描述】:

在我的应用程序中,行从不同的视图添加到我的TableView。当用户添加行时,用户被带回TableView。问题是之前输入的文本不再显示。

我可以使用NSMutableDictionary 加载它,但用户看不到它。关于我应该做什么的任何想法?我应该添加什么代码以及应该在哪里添加它?非常感谢!

这是来自tableview 方法的代码。我认为修复程序会在这里某个地方。

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
static NSString *CellIdentifier = @"Cell";
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) 
    cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cell.wtf = [[UITextField alloc]init];

    NSUInteger count =0;
    for (NSMutableDictionary *search in dataForAllRows) //this just helps me pull the right data out of an array of NSMutableDictionary's

        if ([search valueForKey:@"indexSection"] == [NSNumber numberWithInteger:(indexPath.section -1)]) 

            if ([search valueForKey:@"indexRow"] == [NSNumber numberWithInteger:indexPath.row]) 

                NSMutableDictionary *match = [dataForAllRows objectAtIndex:count];
                [cell.wtf setText:[match objectForKey:@"wtf"]]; 
                NSLog(@"%@",cell.wtf.text); // this outputs the correct value in the command line
            
        
        count++;
     
   

这是我的 CustomCell.m 的代码

#import "CustomCell.h"

@implementation CustomCell
@synthesize wtf, cellPath;

- (void)awakeFromNib 
// Initialization code

  

- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
[super setSelected:selected animated:animated];
// Configure the view for the selected state

-(void)layoutSubviews
wtf = [[UITextField alloc] initWithFrame:CGRectMake(7, 3, 65, self.contentView.bounds.size.height-6)];

self.wtf.delegate = self;

[wtf setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
[wtf setAutocorrectionType:UITextAutocorrectionTypeNo];
[wtf setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[wtf setBorderStyle:UITextBorderStyleRoundedRect];
wtf.textAlignment = NSTextAlignmentCenter;
wtf.keyboardType = UIKeyboardTypeNumberPad;  //
[wtf setAutocapitalizationType:UITextAutocapitalizationTypeWords];
[wtf setPlaceholder:@"enter"];

[self.contentView addSubview:wtf];

【问题讨论】:

两项改进将使您的生活更轻松:(1) 单元格是否在故事板/ib 中定义?如果没有,请执行此操作,(2) 数据源 (dataForAllRows) 的简单转换将澄清代码并避免每次滚动到视图中时对数据进行全面搜索。 @danh 不,我的单元格没有在故事板/ib 中定义。我会看看如何做到这一点。这是我问题的根源吗?对不起,如果我的一些问题是基本的。我对此有点陌生。 您能否将cell.wtf.backgroundColor = [UIColor greenColor]; 添加到您的代码中,以确保将文本字段正确添加到单元格中。并分享将 UITextfield 添加到单元格的代码。 在某种程度上是的。不在 IB 中定义单元会迫使您在代码中执行此操作,这更容易出错,而且您的代码似乎省略了几个必要的步骤。请参阅下面的答案。 @williamb 当我将cell.wtf.backgroundColor = [UIColor greenColor]; 添加到cellForRowAtIndexPath 时什么也没发生。当我在我的 CustomCell.m 文件中添加该代码时,它工作并且背景颜色为绿色。我将UITextfield 添加到我的CustomCell.m 文件中的单元格中。我很快就会将该代码添加到我的问题中。再次感谢您的帮助。 【参考方案1】:

考虑将 IB 中标识符为 @"Cell" 的单元格定义为表格的原型行。然后,使用dequeueReusableCellWithIdentifier:forIndexPath: 检索 cellForRowAtIndexPath 中的单元格。更容易理解单元格的外观,并且可以避免在代码中定义子视图时常见的一些错误。

谈到常见错误,您的代码似乎出现了两个问题:它没有框住文本字段,也没有将其添加为单元格的子视图。两者都会解释看不到文本字段。

@williamb 的建议是正确且必要的:如果单元格的子视图不存在,则仅构建单元格的子视图,但单元格的构建不完整...

if (cell == nil) 
    cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    UITextField *wtf = [[UITextField alloc]initWithFrame:CGRectMake(10,10,200,42];
    [wtf setDelegate:self];
    [cell addSubview:wtf];
    cell.wtf = wtf;

正如我在评论中提到的,分段表应该由二维数组支持。外部数组是一个部分数组。每个部分数组都是一个字典数组,等于您每次通过此方法搜索的字典,但预先安排好,因此在 cellForRowAtIndexPath 中完成的所有操作都是索引到一个数组中:

NSDictionary *d = self.myCorrectlyStructuredModel[indexPath.section][indexPath.row];
cell.wtf.text = d[@"wtf"];

利用现有资源构建它并不是什么大挑战。考虑在解决文本字段问题后立即执行此操作。我(或其他人)可以给你一些建议——如果你需要的话——关于如何构建这个结构。

【讨论】:

嗨@Danh。感谢您的回答。我绝对同意 2D 数组是保存表数据的更好方法,我将在解决此问题后着手解决此问题。在单独的说明中,我的 UITextfield 的问题不在于存在文本字段。 (我在刚刚编辑到原始问题中的 customCell.m 文件中定义了它)我遇到的问题是,当我添加新单元格并返回 TableView UITextfield 时,仅显示占位符文本分配给它。它不加载 cell.wtf.text 值。 你好。我已经解决了部分问题,想知道您是否可以与我分享任何建议。我已经能够将我的一些数据从我的 NSMutableDictionary 数组加载到我的 UITextField 中。但它并没有像我想要的那样加载。我最初选择在二维数组上使用字典,因为每个新部分都成为表中的第 0 部分,而字典是唯一能想到的解决方案。当我以这种方式添加部分时,如何使用二维数组?谢谢!! 认为这个问题是关于设置单元格视图的。希望它得到解决并且应该被标记为正确。请创建一个关于哪种模型最适合您想要的表格类型的问题。请描述表格和数据,并在此处给我留下链接。 这里是链接。 New Question【参考方案2】:

看起来您只是在该单元格不存在的情况下设置文本字段的文本值,并将您的文本字段实例覆盖为没有@danh 提到的框架的实例。我相信您想要做的是在将文本字段添加到单元格的 contentview 后重用它,并更改该文本字段为每个索引路径显示的内容。

尝试重构您的单元格代码,使其更像:

@implementation ExerciseCell

#pragma mark - Init

- (id)initWithStyle:(UITableViewCellStyle)style
    reuseIdentifier:(NSString *)reuseIdentifier

    self = [super initWithStyle:style
                reuseIdentifier:reuseIdentifier];

    if (self)
    
        wtf = [[UITextField alloc] initWithFrame:CGRectMake(7, 3, 65, 44)];

        wtf.delegate = self;

        [wtf setContentVerticalAlignment:UIControlContentVerticalAlignmentCenter];
        [wtf setAutocorrectionType:UITextAutocorrectionTypeNo];
        [wtf setAutocapitalizationType:UITextAutocapitalizationTypeNone];
        [wtf setBorderStyle:UITextBorderStyleRoundedRect];
        wtf.textAlignment = NSTextAlignmentCenter;
        wtf.keyboardType = UIKeyboardTypeNumberPad; 
        [wtf setAutocapitalizationType:UITextAutocapitalizationTypeWords];
        [wtf setPlaceholder:@"enter"];

        [self.contentView addSubview:wtf];        
    

    return self;

和你的 tableview 数据源类更像

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

   static NSString *CellIdentifier = @"Cell";
   CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

   if (cell == nil) 
       cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

       [cell.wtf setDelegate:self];
   

    NSUInteger count = 0;
    for (NSMutableDictionary *search in dataForAllRows) //this just helps me pull the right data out of an array of NSMutableDictionary's

        if ([search valueForKey:@"indexSection"] == [NSNumber numberWithInteger:(indexPath.section -1)]) 

            if ([search valueForKey:@"indexRow"] == [NSNumber numberWithInteger:indexPath.row]) 

                NSMutableDictionary *match = [dataForAllRows objectAtIndex:count];
                [cell.wtf setText:[match objectForKey:@"wtf"]]; 
                NSLog(@"%@",cell.wtf.text); // this outputs the correct value in the command line
            
        
        count++;
     
   

你的意思是两次分配 textField 的委托?一次在单元格中,一次在表格视图的数据源中?

【讨论】:

我尝试了您的代码,但在加载视图时仍然看不到文本。您还有什么建议吗? 您是否正在更改代码中其他任何地方的文本字段的文本颜色或重置文本值?这很奇怪,因为使用该 NSLog 您打印出 cell.wtf.text 并且您说它具有正确的值 不,我不会在任何地方更改颜色。我很确定我没有重置文本值。当输入文本时,它被放入一个 NSMutableDictionary 中,然后放入一个数组中。然后在“cellForRowAtIndexPath”中,我将其从该数组中拉出。我只是不知道如何让它可见。我在设置文本后尝试了[self.tableview reloadData],最后一行消失了。再次感谢。 感谢更新代码。我使用了 ExerciseCell.m 文件中的代码。在return cell; 行我收到错误:使用未声明的标识符“单元格”。我将代码修改为 return self; 它运行但行缺少 wtf UITextField 可能是那个时候没有设置单元格的高度 - 我已经更新了代码以硬编码高度值。如果您有任何问题,您可以尝试一下吗?您是否还可以添加一个断点以使该 init 方法被调用。【参考方案3】:

为了将文本加载到CustomCell中的UITextField中,我添加了以下方法

CustomCell.m

-(void)viewMyCellData
//here I can set text to my textfield
wtf.text = @"Desired Text"; //this will read in every wtf textfield in the table
//getting the right text from an array will be asked in another question that I will post
//in a comment to this answer

接下来我们使用[self viewMyCellData] 调用它 在我们结束时 -(void)layoutSubviews 方法也在 CustomCell.m

【讨论】:

Posted Follow Up Question

以上是关于UITextfield 值已成功更新,但未显示在表格中的主要内容,如果未能解决你的问题,请参考以下文章

UploadReadaheadsize 值已更改,但未解决 Request Entity too large 错误

UITextfield 使用插入在 UITableView 中显示空行

如何断言显示为字符串的货币值已正确更新

用户输入的值保存到 Core Data (?) 但未出现在表视图中

Vue.js状态未更新:已解决

文本字段值已更新并保存,但当再次加载表单并单击按钮时,字段会重置为默认值