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 = @"";
}
您想检查以确保当前行不是最后一行(空白)。
我有一个表格视图,允许用户在点击现有行时将项目(一行)添加到发票(表格视图)。也就是说,我似乎无法添加一个空行,因为我的代码试图用我指定数组中的数据设置单元格中的信息,但自然地,数组中的计数与我的数据源不同(正如我想要的计数为 +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 = @"";
}
您想检查以确保当前行不是最后一行(空白)。