将新项添加到UITableView而不替换旧项

时间:2014-06-09 17:13:10

标签: ios objective-c uitableview

我打算在调用此方法时将项添加到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;
}

1 个答案:

答案 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: