TAGS :Viewed: 4 - Published at: a few seconds ago

UITableView not scrolling smoothly...(iPhone SDK) ..!!

I have implemented UITableView DataSource and Delegate methods in an individual separate classes.(one for delegate and one for datasource) in main program i write only:

//assume that all objects are allocated 
ObjTableView.dataSource=ObjDataSource;
ObjTableView.delegate = ObjDelegate;
[self.view addSubView: ObjTableView];

when i run this code , UITable view appears but when i try to scroll it, it doesn't scroll smoothly. I have also checked that UITableViewCell doesn't redraw once the cell is initialized.

can any one tell me why this happens ? How can i solve this problem ??

From comments:

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];

More from comments:

- (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; 
}

More Information:

I have used NSNotification which notifies to current class when parsing is complete, after receiving notification , current class method calls DataSource, Delegate methods (which is defined in a separate class file).

So UItableViewCell customization (which is in ListDataSource) and table view(in current class) both are in different classes.

Answer 1


A problem is

NSString *CellIdentifier = [NSString stringWithFormat:@"%i",indexPath.row]; 

The id needs to be the same for all cells of the same class, otherwise you never reuse them. As you can see in most examples, it is indeed a constant in most (all?) cases.

Little explaination on the reuseIdentifier: every time a cell gets out of screen, you can reuse it instead of creating a new one. To reuse it, you need a cell in queue with the same identifier as the one you pass to dequeueReusableCellWithIdentifier. The way you did, the cells are never reused, because each id is unique (they may or may not be reused in case a row reappears on screen, depending on queue size, which is not configurable AFAIK). This is why personalization of the cell should happen OUTSIDE the "cell == nil" block. Long story short, you are using the reuseIdentifier not as intendend.

Answer 2


I think Michele is correct, but I would also add that it looks like you are doing your cell customization where the cell gets created. What you should be doing is something more like this:

- (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; 
}

I would also add that I'm not sure why you are able to run the app with the code you have here, since UITableViewCell cell = ... is an invalid initializer. It should be UITableViewCell *cell = ....

It would be helpful to see how you are customizing your cell, since without that it's hard to see what's happening.