UITableView无法顺畅滚动...(iPhone SDK)..!

时间:2010-10-18 11:52:23

标签: iphone

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中)和表视图(在当前类中)都在不同的类中。

2 个答案:

答案 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 = ...

了解如何自定义您的单元格会很有帮助,因为如果没有它,很难看出发生了什么。