2

我有一个UITableViewwith custom UITableViewCells,他们每个人都有一个UITextField. 我为每个 textField 分配一个带有 value : 的标签indexPath.row + 100

好吧,当我在特定的文本字段中键入内容时,我想更新每个单元格的每个文本字段。更清楚地说,当我输入一个数字时,我的视图控制器应该进行一些计算,然后将结果分配给所有其他文本字段,并且每次从 textField 修改文本时都必须这样做,假设我输入了 1(进行一些计算和assing result to textFields) ,然后我输入 2 ,现在要计算的数字将是 12 等等。

问题是我可以在不关闭键盘的情况下从 tableView 重新加载数据。系统会自动隐藏 UIKeyboard ,所以这种情况下 reloaddata 不起作用。

我尝试使用 NSMutableArray 来存储所有这些文本字段,但是当从 cellForRowAtIndexPath 添加它们时,它们会得到很多。

我怎样才能正确更新所有这些UITextFields

4

1 回答 1

1

它只需要更新可见单元格,而不是全部。假设内容计算公式非常简单:

-(NSString*) textForRowAtIndex:(int)rowIndex
{
    return [NSString stringWithFormat:@"%d", startRowValue + rowIndex];
}

每个单元格都包含UITextField带有标签的对象indexPath.row + 100

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* cellId = @"cellId";
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if(!cell)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId] autorelease];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        UITextField* tf = [[[UITextField alloc] initWithFrame:CGRectMake(10, 8, 280, 30)] autorelease];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldTextDidChange:) 
                                                     name:UITextFieldTextDidChangeNotification object:tf];
        tf.delegate = (id)self;
        [cell.contentView addSubview:tf];
    }

    UITextField* tf = (UITextField*)[[cell.contentView subviews] lastObject];
    tf.tag = indexPath.row + 100;
    tf.text = [self textForRowAtIndex:indexPath.row];

    return cell;
}

然后所有可见单元格都将在textFieldTextDidChange:方法中更新:

-(void) textFieldTextDidChange:(NSNotification*)notification
{
    UITextField* editedTextField = (UITextField*)[notification object]; 
    int editedRowIndex = editedTextField.tag - 100;
    int editedValue = [editedTextField.text intValue];
    startRowValue = editedValue - editedRowIndex;

    for (NSIndexPath* indexPath in [self.tableView indexPathsForVisibleRows])
    {
        if(indexPath.row != editedRowIndex)
        {
            UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
            UITextField* textField = (UITextField*)[cell.contentView viewWithTag:indexPath.row+100];
            textField.text = [self textForRowAtIndex:indexPath.row];
        }
    }
}

让我们有 50 个单元格:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return 50;
}

并在完成编辑时隐藏键盘:

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

享受!

于 2012-06-23T23:47:09.243 回答