Roxana
Roxana

Reputation: 38

App freezes when scrolling in tableview

My app freezes when scrolling in tableview. It loads the data, but when I try to scroll, the app freezes immediately. What is the problem? My cellforrowatindexpath method is:

if (cell == nil) { 

    cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCellView" owner:self options:nil]objectAtIndex:0];
}

getDats *gDatas=[[[getDats alloc]init]autorelease];

gDatas=[self.bookmarks objectAtIndex:indexPath.row];

const char *prior = "High"; 

const char *prior1 =[gDatas.Priority UTF8String]; 

if (strcmp(prior1 , prior) == 0)
 {
    NSString *imagePath = [[NSBundle mainBundle]pathForResource:@"highPriority" ofType:@"png"]; 

cell.imageView.image = [UIImage imageWithContentsOfFile:imagePath];   
}

[cell.MOwner setText:gDatas.WhatId];

[cell.DueDate setText:gDatas.EndDateTime];

[cell.theTextLabel setText:gDatas.Subject];

[cell.Descri setText:gDatas.Desc];

[cell.TaskId setText:[NSString stringWithFormat:@"%d" , gDatas.rowId]];  

cell.backgroundView.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];

return cell;

and the debugger shows:

-[__NSCFString Priority]: unrecognized selector sent to instance 0x7341790 2012-07-09 10:23:46.761 MeetingMaker[716:207] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString Priority]: unrecognized selector sent to instance 0x7341790' * First throw call stack: (0x1cbf052 0x2152d0a 0x1cc0ced 0x1c25f00 0x1c25ce2 0xf449 0x4e7e0f 0x4e8589 0x4d3dfd 0x4e2851 0x48d301 0x1cc0e72 0x29492d 0x29e827 0x224fa7 0x226ea6 0x2c037a 0x2c01af 0x1c93966 0x1c93407 0x1bf67c0 0x1bf5db4 0x1bf5ccb 0x2656879 0x265693e 0x44ea9b 0xe0c2 0x1e15) terminate called throwing an exception(gdb) .

The app shows an error on line:

const char *prior1 =[gDatas.Priority UTF8String]; 

and shows

Thread:Program received signal SIGABRT .

Upvotes: 0

Views: 1152

Answers (1)

Oscar Gomez
Oscar Gomez

Reputation: 18488

You need to reuse your cells, when you scroll down a UITableView, cells that are no longer in view get reused, for that you need to set a resuseIdentifier to the cell.

From the UITableViewCell docs

reuseIdentifier
A string used to identify a cell that is reusable. (read-only)

@property(nonatomic, readonly, copy) NSString *reuseIdentifier
Discussion
The reuse identifier is associated with a UITableViewCell object that the table-view’s delegate creates with the intent to reuse it as the basis (for performance reasons) for multiple rows of a table view. It is assigned to the cell object in initWithFrame:reuseIdentifier: and cannot be changed thereafter. A UITableView object maintains a queue (or list) of the currently reusable cells, each with its own reuse identifier, and makes them available to the delegate in the dequeueReusableCellWithIdentifier: method.

Therefore you should be starting your method with something like this:

static NSString *CellIdentifier = @"Cell";  
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (cell == nil) {      
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

}

Upvotes: 1

Related Questions