UITextfield值已成功更新,但未在表

时间:2015-07-31 16:18:22

标签: ios objective-c iphone uitableview uitextfield

在我的应用中,行从另一个视图添加到我的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];
}

3 个答案:

答案 0 :(得分:1)

考虑使用标识符@" Cell"定义单元格。在IB中作为表的原型行。然后,使用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;
}

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

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

从你拥有的东西中建立这个并不是一个很大的挑战。在解决文本字段问题后,请考虑正确执行此操作。我(或其他人)可以给你一些建议 - 如果你需要的话 - 关于如何建立这种结构。

答案 1 :(得分:0)

如果该单元格不存在,并且将文本字段实例覆盖为没有提及@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的代表吗?一旦进入单元格,一次进入tableview的数据源?

答案 2 :(得分:0)

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

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方法