UITableView无法顺畅滚动...(iPhone SDK).. !!
我已在单个单独的类中实现了UITableView DataSource和Delegate方法。(一个用于委托,一个用于数据源)在主程序中我只写:
//assume that all objects are allocated
ObjTableView.dataSource=ObjDataSource;
ObjTableView.delegate = ObjDelegate;
[self.view addSubView: ObjTableView];
当我运行此代码时,会出现UITable视图,但是当我尝试滚动它时,它不能平滑滚动。 我还检查了一旦初始化单元格,UITableViewCell不会重绘。
任何人都可以告诉我为什么会这样吗?我怎样才能解决这个问题?
来自评论:
ListDataSource *ObjListDataSource = [[ListDataSource alloc]initWithArray:[[sender object] valueForKey:@"List"]];
ListDelegate *ObjListDelegate = [[ListDelegate alloc]initWithArray:[[sender object] valueForKey:@"List"]];
tblList = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
tblList.dataSource = ObjListDataSource; tblList.delegate = ObjListDelegate;
[self.view addSubview:tblList]; [tblShopList release];
更多来自评论:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = [NSString stringWithFormat:@"%i",indexPath.row];
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0,0,320,100) reuseIdentifier:CellIdentifier] autorelease];
//custom cell code
}
return cell;
}
更多信息:
我使用了NSNotification,它在解析完成时通知当前类,在收到通知后,当前类方法调用DataSource,Delegate方法(在单独的类文件中定义)。
所以UItableViewCell定制(在ListDataSource中)和表视图(在当前类中)都在不同的类中。
答案 0 :(得分:4)
问题是
NSString *CellIdentifier = [NSString stringWithFormat:@"%i",indexPath.row];
对于同一类的所有单元格,id必须相同,否则您永远不会重复使用它们。正如您在大多数示例中所看到的,在大多数(所有?)情况下它确实是一个常量。
对reuseIdentifier的解释很少:每当一个单元格离开屏幕时,你可以重复使用它而不是创建一个新的单元格。要重用它,您需要一个队列中的单元格,其标识符与您传递给dequeueReusableCellWithIdentifier
的单元格相同。你的方式,单元格永远不会被重用,因为每个id都是唯一的(如果行重新出现在屏幕上,它们可能会重复使用,也可能不会重复使用,具体取决于队列大小,这是不可配置的AFAIK)。这就是为什么单元格的个性化应该发生在“cell == nil
”块之外。简而言之,您使用的是reuseIdentifier而不是意图。
答案 1 :(得分:0)
我认为Michele是正确的,但我还要补充说,看起来你正在进行细胞定制,细胞被创建。你应该做的更像是这样:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = (UITableViewCell)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectMake(0,0,320,100) reuseIdentifier:CellIdentifier] autorelease];
//custom REUSABLE cell code here, e.g. text color, etc.
}
NSString *cellText = [dataArray objectAtIndex:indexPath.row]; //assuming you have a simple array for your data
cell.textLabel.text = cellText;
return cell;
}
我还要补充一点,我不确定为什么你能用你在这里的代码运行应用程序,因为UITableViewCell cell = ...
是一个无效的初始化程序。它应该是UITableViewCell *cell = ...
。
了解如何自定义您的单元格会很有帮助,因为如果没有它,很难看出发生了什么。