2015-10-15 56 views
0

我的应用程序中有一个UITableView,我有用户将行添加到表中。我这样做,通过调用“insertRowAtIndexPath”:由于某种原因在iOS中调用insertRowToIndexPath之后不保存数据

- (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

为什么你将UITableViewCell保存在单元格数组中?而你已经有self.tableData数组中的所有数据 –

回答

2

为什么你会将UITableViewCell保存在单元格数组中?而你已经拥有了self.tableData阵列中的所有数据。永远不要存储/访问UI对象,只需使用数据模型。

即将到来,从UITableView文档,cellForRowAtIndexPath返回零,如果单元格不可见。所以即使你有10个单元格,如果只有4个单元格可见,那么这个方法将返回nil为剩下的6个单元格。

- (nullable __kindof UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath; 
// returns nil if cell is not visible or index path is out of range 
+0

我想这正是我的问题。在我的表格中,有些字段允许用户输入数据。有没有办法让我遍历表并收集用户输入的所有数据? – syedfa

+0

我不这么认为,当tableview滚动时,隐藏单元格中的数据将会丢失。除非将数据存储在模型中,否则无法访问该数据。 –

+0

或者你可以给每个单元格赋予不同的单元格标识符,这样当你出队时你将得到相同的单元格。但即使这样,你也无法得到不可见的行 –

1

你为什么不这样做相反的,让你dataArray中的副本表的数据源,在addRow然后将其添加到数据源阵列,重装表,打save然后进行dataArray中的= dataArrayCopy时,它会如果修改数据源比表格本身更容易

+0

非常感谢您的回复。你能告诉我你希望我做什么吗?我不确定我明白。 – syedfa

+0

嗨,好吧...我不知道我明白你在做什么,但不是你已经用'[self.tableData addObject:theObjectToInsert]修改了你数据数组中的数据;'?只需调用'[self.tableView reloadData];'而不是那些在那行之下插入冗长的代码? 如果你想获得细胞的数量,你不能计数,因为你不需要计数你的数据源数组''[self.tableData count]' – Tj3n

+0

我想这正是我的问题。在我的表格中,有些字段允许用户输入数据。有没有办法让我遍历表并收集用户输入的所有数据? – syedfa

1

这不是找出迄今为止创建了多少行的正确方法。我相信你必须在你的cellForRowAtIndexPath:方法中使用表视图的出队功能。此功能只允许在内存中的可见单元格,而不是全部。因此,即使您的模型中有50个数据集,您仍然会感觉有50个细胞存在但没有 - 在任何时间点,您都只能看到可见细胞数。这里的关键是 - 在屏幕上不可见的单元格被iOS丢弃。

您的模型计数(self.tableData.count)是了解您可能拥有多少个细胞的正确方法。

相关问题