insertRowsAtIndexPaths不调用cellForRowAtIndexPath

时间:2010-07-27 07:19:06

标签: iphone

我创建了示例tableview应用程序,我在tableview上方有一个添加按钮,当用户按下添加按钮时,我们只想在表视图中添加行。

我正在写这样的代码

- (void)viewDidLoad {
    isEditing = NO;
    Mutarray = [[NSMutableArray alloc]init];
    [super viewDidLoad];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section       {
// Return the number of rows in the section.
    if (isEditing)
        return [Mutarray count];
    else
        return 0;
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }
    [TableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
    NSLog(@"Row = %d", indexPath.row);
// Configure the cell...
    cell.textLabel.text = [Mutarray objectAtIndex:indexPath.row];
    return cell;
}

//When add button pressed

-(IBAction)Add:(id)sender
{   
    isEditing = YES;

    [Mutarray addObject:[NSString stringWithFormat:@"%d",[Mutarray count]]];

    NSArray *insertIndexPaths = [NSArray arrayWithObjects:
                    [NSIndexPath indexPathForRow:[Mutarray count]-1 inSection:0],
                             nil];

    [self.TableView beginUpdates];
    [self.TableView insertRowsAtIndexPaths:insertIndexPaths withRowAnimation:UITableViewRowAnimationRight];
    [self.TableView endUpdates];
}

此代码工作正常。但问题是我的tableview高度为418,它只显示10行可见。因此,当添加11行时,它在tableview中添加但没有调用此cellForRowAtIndexPath函数,因此我无法自动滚动页面...它调用cellForRowAtIndexPath函数的前10行。

所以我怀疑是为什么cellForRowAtIndexPath函数只调用可见行? 那么如何自动滚动我的tableview?

1 个答案:

答案 0 :(得分:3)

  

所以我怀疑的是为什么   仅限cellForRowAtIndexPath函数   调用可见行?

出于优化原因,这是如此。如果表视图已为其所有行创建了单元格,则可能会显着降低性能。而不是该表视图仅为可见的行创建单元格(并且可能还有一些以确保平滑滚动),然后将它们重新用于可见的行 - 所以实际上您可以显示数百个行,例如10个单元格对象 - 这是一个巨大的节省。

  

然后我该如何自动滚动我的   tableview?

您可以在add方法中添加一行后立即滚动:

    ...
    [table endUpdates];

    [table scrollToRowAtIndexPath:[insertIndexPaths objectAtIndex:0]
           atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

P.S。传统上,objective-c中的方法和变量名以小写字母开头,遵循该指南是更好的风格。