我打算在调用此方法时将项添加到UITableView。新项目已成功添加(但有一个问题,如下所述),但我认为它很奇怪,因为我认为“开始更新”到“结束更新”应该处理这个(插入一个新行)。我放入的初始if条件从未运行过,因此整个区域从未执行过。我最近才意识到这一点并将条件更新为现在的状态。现在if块被执行并且它崩溃了应用程序。
当它现在被注释掉时......添加了新项目,但newNameOfItem替换了任何现有的单元格标签。
我希望在每次调用时将x(newNumberOfItems)新项目添加到新的部分中。我怎样才能做到这一点?
- (void)addNew:(NSString *)newNumberOfItems :(NSString *)newNameOfItem
{
if(!self.numberOfRows){
NSLog(@"Initially no of rows = %d", self.numberOfRows);
self.numberOfRows = [self.numberOfItems intValue];
NSLog(@"Then no of rows = %d", self.numberOfRows);
}
else
{
self.numberOfRows = self.numberOfRows + [newNumberOfItems intValue];
NSLog(@"New no rows = %d", self.numberOfRows);
}
NSLog(@"run = %d", self.run);
如果声明......
开始更新 /*if(self.secondRun){
NSLog(@"run = %d it it", self.run);
[self.tableView beginUpdates];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.numberOfRows-[newnumberOfItems intValue] inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationBottom];
[self.tableView endUpdates];
}
*/
[self.tableView reloadData];
}
...
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];
cell.textLabel.text = self.nameOfItem;
return cell;
}
...
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.numberOfRows;
}
答案 0 :(得分:1)
如果要在每次调用-addNew…
时向新部分添加新项目,则应创建NSMutableArray
个部分,其中每个成员都是表示行数据的对象数组(在本例中)好像你想要NSString
代表项目的名称。结构看起来像:
mySections = @[ @[@"section 0 row 0 name", @"section 0 row 1 name", …], @[@"section 1 row 0 name", @"section 1 row 1 name", …], …]
然后在numberOfRowsInSection:
返回mySection[indexPath.section].count
。
每个标签都具有相同的值,因为您为每个出列到self.nameOfItem
的单元格设置了每个标签。这正是你告诉它要做的事情。如果您的目的是为每个部分/行设置不同的文本,则必须从某处获取该文本。如果您创建了如上所述的mySections
数组,则可以:
cell.textLabel.text = mySections[indexPath.section][indexPath.row] ;
关于-addNew:…
的说明:只是向mySections
数组中添加新项目不会导致更新tableview。如您所知,[self.tableView reloadData]
将为您执行此操作。但是,它将重新加载整个表,而不是仅更新您添加的行。为了更有效地执行此操作(并使用漂亮的动画),您可以使用[self.tableView beginUpdates/endUpdates]
。在上面的情况中,您要添加整个部分而不仅仅是行,您应该使用insertSections:withRowAnimation:
。