在tableview中滚动时应用冻结

时间:2012-07-03 12:44:24

标签: iphone

在桌面视图中滚动时我的应用会冻结。它加载数据,但是当我尝试滚动时,应用程序立即冻结。问题是什么?我的cellforrowatindexpath方法是:

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;

,调试器显示:

  

- [__ NSCFString Priority]:无法识别的选择器发送到实例0x7341790   2012-07-09 10:23:46.761 MeetingMaker [716:207] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [__ NSCFString Priority]:无法识别的选择器发送到实例0x7341790'   * 第一次抛出调用堆栈:   (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)   终止调用抛出异常(gdb)。

该应用在线显示错误:

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

并显示

  

线程:程序接收信号SIGABRT。

1 个答案:

答案 0 :(得分:1)

你需要重用你的单元格,当你向下滚动一个UITableView时,不再在视图中的单元格被重用,因为你需要为单元格设置一个resuseIdentifier。

来自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.

因此,你应该用这样的方法开始你的方法:

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

}