我创建了示例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?
答案 0 :(得分:3)
所以我怀疑的是为什么 仅限cellForRowAtIndexPath函数 调用可见行?
出于优化原因,这是如此。如果表视图已为其所有行创建了单元格,则可能会显着降低性能。而不是该表视图仅为可见的行创建单元格(并且可能还有一些以确保平滑滚动),然后将它们重新用于可见的行 - 所以实际上您可以显示数百个行,例如10个单元格对象 - 这是一个巨大的节省。
然后我该如何自动滚动我的 tableview?
您可以在add
方法中添加一行后立即滚动:
...
[table endUpdates];
[table scrollToRowAtIndexPath:[insertIndexPaths objectAtIndex:0]
atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
P.S。传统上,objective-c中的方法和变量名以小写字母开头,遵循该指南是更好的风格。