在iOS

时间:2015-10-15 03:48:47

标签: ios objective-c uitableview

我的应用程序中有一个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”,即使我已经添加了更多。任何人都可以看到它的错误吗?

3 个答案:

答案 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)是了解您可能拥有的细胞数量的正确方法。