将 UITableViewCell 内的 UITextField 保存到 NSMutableArray

Posted

技术标签:

【中文标题】将 UITableViewCell 内的 UITextField 保存到 NSMutableArray【英文标题】:Save UITextField inside of a UITableViewCell to NSMutableArray 【发布时间】:2012-03-22 02:34:43 【问题描述】:

好的,我知道以前有人问过这个问题,但我的问题与其他问题不同。

我在自定义表格视图单元格中有一个文本字段,我需要在数字键盘被解除后将其保存到数组中。由于数字键盘没有完成按钮,我不得不实现一个触摸事件来关闭数字键盘。这意味着我的 -textFieldDidEndEditing 没有触发。以下是相关代码:

在我的 viewController.h 中

itemData *tempItem; //A custom object    
UITableView *itemsListTable;
NSMutableArray *listData;

在我的 viewController.m 中

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

       static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";


        UITableViewCell *cell = [itemsListTable
                                 dequeueReusableCellWithIdentifier:SimpleTableIdentifier];

        if (cell == nil) 
            cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                          reuseIdentifier:SimpleTableIdentifier];


        NSInteger row = indexPath.row;
        tempItem = [listData objectAtIndex:row];
        cell.textLabel.text = [tempItem getItemName];


        UITextField *quantityTextField = [[UITextField alloc] initWithFrame:CGRectMake(275, 8, 35, 27)];
        quantityTextField.keyboardType = UIKeyboardTypeNumberPad;
        quantityTextField.borderStyle = UITextBorderStyleRoundedRect;
        quantityTextField.returnKeyType = UIReturnKeyDone;
        quantityTextField.text = [NSString stringWithFormat:@"%d", tempItem.getItemQuantity];
        quantityTextField.textAlignment = UITextAlignmentCenter;


        [cell addSubview:quantityTextField];
         


        return cell;

    

-(void)touchesEnded: (NSSet *)touches withEvent: (UIEvent *)event 
[[self itemsListTable] endEditing:YES];
    
- (void)textFieldDidEndEditing:(UITextField *)textField 

    UITableViewCell *cell = (UITableViewCell*)textField.superview;

    NSIndexPath *indexPath = [self.itemsListTable indexPathForCell:cell];

    tempItem = [listData objectAtIndex:indexPath.row];

    NSLog(@"Did End Editing");
    [tempItem setItemQuantity:[textField.text intValue]]; //save textfield to object as intValue

    [listData replaceObjectAtIndex:indexPath.row withObject:tempItem]; //save object to array


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
        [listData removeObjectAtIndex:indexPath.row];
        [itemsListTable reloadData];
        


- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section

    numberOfItems.text = [NSString stringWithFormat:@"%d",listData.count];

    return [self.listData count];

【问题讨论】:

另外,为了良好的命名约定,所有类的名称都应以大写字母开头,例如ItemData 而不是 itemData @ShivanRaptor 我只发布了与 UITableView 或 UITextField 相关的代码 【参考方案1】:

当您的触摸事件关闭键盘时,也调用 [self textFieldDidEndEditing:],或者如果您需要知道哪个文本字段最后获得了焦点,请通过定义一个 UITextField 对象来保持引用,该对象设置为当前具有textFieldDidBeginEditing 委托函数中的第一响应者。像这样:

//In .h
UITextField * txtReference;

//In .m
- (void)textFieldDidBeginEditing:(UITextField *)textField
    txtReference = textField;


//In the function that dismisses the keyboard put:
[self textFieldDidEndEditing:txtReference];

【讨论】:

谢谢!这非常适合我的要求!不幸的是,我意识到我需要一种不同的方法,因为我在每个单元格中都有一个文本字段;) 如果您在每个单元格中都有 UITextfield,您是否考虑过制作自定义单元格(如果还没有)。

以上是关于将 UITableViewCell 内的 UITextField 保存到 NSMutableArray的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableViewCell 内的 UITextField 保存到 NSMutableArray

如何将 UITableViewCell 内的 UICollectionViewCell 的选定索引路径保存到数组中?

Firestore - UITableViewCell 内的 UISlider

无法更改 UITableViewCell 内的 UIButton 图像

UITableViewCell 内的 UIScrollView - 水平滚动

UITableViewCell 内的 UIButton 默认点击动画