0

テーブルビューでスクロールするとアプリがフリーズします。データをロードしますが、スクロールしようとすると、アプリがすぐにフリーズします。何が問題ですか?私の 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]: 認識されないセレクター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) .

アプリはオンラインでエラーを表示します:

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

とショー

スレッド: プログラムはシグナル SIGABRT を受信しました。

4

1 に答える 1

1

セルを再利用する必要があります。UITableView を下にスクロールすると、表示されなくなったセルが再利用されます。そのためには、セルに resuseIdentifier を設定する必要があります。

UITableViewCell ドキュメントから

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

}

于 2012-07-03T12:50:01.293 に答える