我的应用程序中有一个UITableView,我让用户在表中添加行。我这样做是通过调用“insertRowAtIndexPath”:
- (IBAction)addRow:(id)sender {
NSString *theObjectToInsert = [NSString stringWithFormat:@"Row #: %lu", (unsigned long)[self.tableData count]];
[self.tableData addObject:theObjectToInsert];
NSLog(@"What is the count of the collection? %lu", self.tableData.count-1);
NSIndexPath *newPath=[NSIndexPath indexPathForRow:self.tableData.count-1 inSection:0];
[self.myTable insertRowsAtIndexPaths:@[newPath] withRowAnimation:UITableViewRowAnimationAutomatic];
[self.myTable scrollToRowAtIndexPath:newPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
我发现的问题是,在添加必要的行之后,我不会像我认为的那样保存数据。以下是应该存储数据的方法:
- (void)saveAction {
//I iterate through my entire UITableView to tally up the data from all of the rows
NSMutableArray *cells = [[NSMutableArray alloc] init];
for (NSInteger j = 0; j < [self.myTable numberOfSections]; ++j) {
for (NSInteger i = 0; i < [self.myTable numberOfRowsInSection:j]; ++i) {
if ([self.myTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]) {
[cells addObject:[self.myTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:j]]];
}
}
}
NSLog(@"The number of table rows are: %lu", (unsigned long)[cells count]);
}
出于某种原因,这只打印出“4”,即使我已经添加了更多。任何人都可以看到它的错误吗?
答案 0 :(得分:2)
为什么要将UITableViewCell
保存在cells数组中?虽然你已经拥有self.tableData
数组中的所有数据。永远不要存储/访问UI对象,只需使用数据模型。
接下来,从UITableView
文档开始,cellForRowAtIndexPath
如果单元格不可见则返回nil 。因此,即使您有10个单元格,如果只有4个单元格可见,则此方法将为剩余的6个单元格返回nil。
- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
// returns nil if cell is not visible or index path is out of range
答案 1 :(得分:1)
为什么不反过来,在addRow
上创建dataArray的副本作为表数据源,然后将其添加到数据源数组,重新加载表,当命中save
然后进行dataArray = dataArrayCopy,如果修改数据源比表本身更容易
答案 2 :(得分:1)
这不是找出到目前为止创建了多少行的正确方法。我相信您必须在x-epsilon
方法中使用表格视图的出列功能。此功能仅允许内存中的可见单元格而不是全部。因此,即使您的模型中有50个数据集,您也会感觉到50个单元存在但是没有 - 在任何时间点,您只能获得可见的单元数。这里的关键是 - iOS上丢弃了屏幕上不可见的单元格。
您的模型计数(epsilon
)是了解您可能拥有的细胞数量的正确方法。