自定义表格视图单元格中的可编辑文本字段

Posted

技术标签:

【中文标题】自定义表格视图单元格中的可编辑文本字段【英文标题】:Editable textfield in custom table view cell 【发布时间】:2015-07-25 07:10:26 【问题描述】:

我有一个带有文本字段和两个标签的自定义表格视图单元格

TableViewCell:

@interface CartTableViewCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *proCost;
@property (weak, nonatomic) IBOutlet UITextField *txtQtyCount;
@property (weak, nonatomic) IBOutlet UILabel *lblTotalCost;

@end

ViewController.h

@interface CartViewController : UIViewController<UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate,UITabBarControllerDelegate>
@property (weak, nonatomic) IBOutlet UITableView *tblView;
@end

ViewController.m

- (BOOL)textFieldShouldReturn:(UITextField *)textField

CGPoint origin = textField.frame.origin;
    CGPoint point = [textField.superview convertPoint:origin toView:self.tblView];

    NSIndexPath * indexPath = [self.tblView indexPathForRowAtPoint:point];
    NSLog(@"%ld",(long)cartCell.txtQtyCount.tag);
    [self.tblView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];

    qty = cartCell.txtQtyCount.text;
    quanty = [qty doubleValue];
    double qua = price * quanty;
    qtotal =[[NSString alloc] initWithFormat:@"%.2f",qua];
    [dictionary setObject:qtotal forKey:@"qtotal"];
    [dictionary setObject:qty forKey:@"qty"];

    [self.tblView beginUpdates];
   NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tblView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
  [self.tblView endUpdates];
    [cartCell.txtQtyCount resignFirstResponder];

    return YES;


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



    cartCell =[self.tblView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    NSDictionary *tmpDict = [myObject objectAtIndex:indexPath.row];
    NSMutableString *name;
    name = [NSMutableString stringWithFormat:@"%@ ",
              [tmpDict objectForKey:@"name"]];


    qty = [NSMutableString stringWithFormat:@"%@ ",
             [tmpDict objectForKey:@"qty"]];

    NSString *qtot = [NSString stringWithFormat:@"%@",[tmpDict objectForKey:@"qtotal"]];


    NSMutableString *qcost;
    qcost = [NSMutableString stringWithFormat:@"%@ ",
                [tmpDict objectForKey:@"total"]];

    cartCell.txtQtyCount.tag = indexPath.row;
    cartCell.proCost.text = qcost;
    cartCell.txtQtyCount.text = qty;
    cartCell.lblTotalCost.text = qtot;

实际上,我有一个 proCost 和一个 double 值,txtQtyCount 可以在其中更新数量,因此我将价格乘以数量,并希望将相乘后的值保存在 lblTotalCost 中。我不清楚如何获取已编辑行的值(索引路径)。

【问题讨论】:

你能发布 cellForRowAtIndexPath: 方法吗? 你是不是在这个方法中返回了单元格,还是你删除了一部分? 是的,不幸的是我删除了该行,但我在编码中返回了单元格 你已经为 UITextField 设置了标签,还不够吗? 是的,但我不知道如何在 textfieldShouldReturn: 方法中获取已编辑文本的值和相应的价格 【参考方案1】:

您可以通过查看更新的数据源数组(myObject)来检索您需要的任何值。

显然,您需要保持更新,因此当用户输入新数量时,请确保相应地在与文本字段标签相同的索引处更新“数量”tmpDict。

【讨论】:

[((NSMutableDictionary *)[myObject objectAtIndex:textfield.tag]) setObject:(用户在文本字段中输入的值) forKey:@"qty"];【参考方案2】:

遇到过类似的问题。我想我真正需要的是正确单元格中该视图的indexPath

所以.. 我做了一个UITakeView category 并有这样的方法:

 -(NSIndexPath *)indexPathForCellContaininView:(UIView *)view
    
        while (view != nil)

            if ([view isKindOfClass:[UITableViewCell class]])

                    return [self indexPathForCell:(UITableViewCell *)view];
            else 
                        view = [view superview];
            
        

        return nil;
    

然后您可以在对您的用例有意义的UITextFields 委托中使用它 - 启用:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string

    NSIndexPath *indexPath = [self.tableView indexPathForCellContaininView:textField];

/// do something with the index path - you have the exact cell / uitextfield being edited // 

return YES; 

【讨论】:

以上是关于自定义表格视图单元格中的可编辑文本字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在自定义表格视图单元格中保存文本字段

如何区分自定义单元格中的两个文本字段?

iOS:自定义表格视图单元格中的约束

从自定义 tableView 单元格文本字段中获取数据

iOS:如何从 tableview 的自定义单元格中的 UITextField 访问值

自定义表格单元格中的堆栈视图