Obj-C-点击单元格时向 TableView 添加新行?

Obj-C- Add new row to TableView when cell is tapped?

我有一个表格视图,允许用户在点击现有行时将项目(一行)添加到发票(表格视图)。也就是说,我似乎无法添加一个空行,因为我的代码试图用我指定数组中的数据设置单元格中的信息,但自然地,数组中的计数与我的数据源不同(正如我想要的计数为 +1).

E.g. I want to return 3 cells even if there are only 2 dictionaries in my array, and the third cell should be empty.

我想要这个是因为第三个单元格允许我的用户填写空字段,而前两行中的字段是用他们已经输入的数据填充的。这是我现在尝试 return 额外行的方法,但如上所述,由于数组中 returned 的词典不平衡,它使我的应用程序崩溃。

到目前为止,这是我的代码:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
   
    self.allItems = [[NSMutableArray alloc] init];
    self.itemDetails = [[NSMutableDictionary alloc] init];

}

//TableView delegates
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 1;
   
    
}




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


    return self.allItems.count + 1;

}



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

        static NSString *ClientTableIdentifier = @"InvoiceDetailsTableViewCell";
        
       InvoiceDetailsTableViewCell *cell = (InvoiceDetailsTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:ClientTableIdentifier];
        
        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InvoiceDetailsTableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
            
        }
    
    if (self.allItems.count == 0) {
        
    } else {
        
        cell.itemName.text = [self.allItems valueForKey:@"Item Name"][indexPath.row];
     
        
    }
    
        return cell;
        
    
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
   InvoiceDetailsTableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
   
    NSString *itemTitle = cell.itemName.text;
    NSString *itemDescrip = cell.itemDescrip.text;
    NSString *itemCost = cell.itemCost.text;
    NSString *itemTax = cell.itemTax.text;
    
    
    [self.itemDetails setValue:itemTitle forKey:@"Item Name"];

    [self.itemDetails setValue:itemDescrip forKey:@"Item Description"];
    
    [self.itemDetails setValue:itemCost forKey:@"Item Cost"];
  
    [self.itemDetails setValue:itemTax forKey:@"Item Tax Rate"];

    [self.allItems addObject:self.itemDetails];
    
    [self.tableView reloadData];

}

一个重要的问题是以下行:

cell.itemName.text = [self.allItems valueForKey:@"Item Name"][indexPath.row];

由于您的行数超过了数组中的项目数,因此您需要在访问数组之前检查行号:

NSInteger row = indexPath.row;
if (row < self.allItems.count) {
    cell.itemName.text = self.allItems[row][@"Item Name"]; // personally, I’d get row first, and then keyed value second
} else {
    cell.itemName.text = @"";
}

您想检查以确保当前行不是最后一行(空白)。