2010-12-01 4 views
0

包括的な選択リストとして動作するようにUITableViewをプログラミングしています。私のテーブルは正しく表示され、複数のセルをチェックボックスで選択することができます。私の問題は、選択されたセル(右にチェックマークが付いているセル)は、スクロールして表示されていないとき(セルのチェックマークが消える)、選択したステータスが失われてしまうことです。私は、セルが表示外にスクロールされても、テーブル内のセルに選択されたものを保存しておきたい。これを引き起こしていることは誰にも分かりますか?ここでUITableViewを包括的な選択リストとして構成する際の問題

は私のTableViewControllerクラスの内部に私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
} 

NSUInteger row = [indexPath row]; 
cell.textLabel.text = [widgetTitles_glob objectAtIndex:row]; 
cell.detailTextLabel.text = @""; 
cell.textLabel.textColor = [UIColor blackColor]; 
cell.textLabel.font = [UIFont boldSystemFontOfSize:15]; 
cell.accessoryType = UITableViewCellAccessoryNone; 
return cell; 

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
[tableView deselectRowAtIndexPath:[tableView indexPathForSelectedRow] animated:YES]; 
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
if (cell.accessoryType == UITableViewCellAccessoryNone) { 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    // Reflect selection in data model 
} else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { 
    cell.accessoryType = UITableViewCellAccessoryNone; 
    // Reflect deselection in data model 
} 

}

すべてのヘルプは非常に高く評価されるだろう。

答えて

0

cellForRowAtIndexPath:accessoryTypeをnone ...と指定していましたので、そのデリゲートをスクロールしてアクセサリタイプをnoneに設定してください。そうすれば、urコードを変更する必要があります。

私も次のように私は解決策に来た...一度このPRBに直面している

..

ストア配列の選択indexPathのindexPath.row値(このコードはdidSelectRowAtIndexPathデリゲートにする必要があります)それならばその配列から削除選択されていません.. cellForRowAtIndexPathメソッドでは、私はforループを使用し、そのindexPath.rowが存在するかどうかをチェックしてチェックマークにそのアクセサリのタイプを変更しない場合

+0

if(cell == nil)条件は、割り当てられたテーブル内のすべてのセルを保持するべきではありませんか? – Sabobin

+0

indexPath.rowを格納するだけでなく、indexPath全体を格納する必要があります。 'if([selectedRows containsObject:indexPath.row])をチェックすると、cell.accessoryType = UITableViewCellAccessoryCheckmark; else セル。accessoryType = UITableViewCellAccessoryNone; 'スクロールすると、各セクションの最初の行がすべてチェックマークが付けられます。代わりに、セクションと行の両方を保持するため、indexPath全体を保存する必要があります。 – tazboy

0

ありがとうございました。これは、実際に細胞がUITableViewCellAccessoryNoneにリセットを取得した理由はcellForRowAtindexPathの内側に次のコード行のbecasueだったことが判明:

cell.accessoryType = UITableViewCellAccessoryNone; 

これは、テーブルを固定している取り外します。

+1

いいえ、それは修正されません...スクロールすると、チェックはランダムに表示されるか消えます。 – benzado

+1

@benzado:u r right – KingofBliss

1

UITableViewを正しく使用している場合、画面に収まるように必要な数だけUITableViewCellインスタンスが割り当てられます。テーブルを下にスクロールすると、セルが画面の上から消えて、それが底に再配置されます。

デリバートメソッドtableView:cellForRowAtIndexPath:は、新しいセルを作成するか、リサイクルされたセルを再設定するかのいずれかを設定します。

適切なことは、配列を使用してチェック/チェックされていない値を格納することです。 didSelectRowAtIndexPath:が呼び出されると、セルと配列が更新されます。 tableView:cellForRowAtIndexPath:が呼び出されると、配列内の値に基づいてセルが構成されます。

あなたのコメントに基づいて、あなたはすでにdidSelectRowAtIndexPath:で正しいことをしています。そのセルがすでにチェックされている行を表す可能性があるため、セルインスタンスの設定時にこれらの値を使用するだけです。配列をチェックし、それに応じてcell.accessoryTypeを設定します。

+0

いいえ、実際にNSUserDefaultsオブジェクトの状態を表すセルが必要なので、私はあなたのアドバイスを使用し、セルをデフォルトに合わせて更新し、セルが選択されたときにデフォルトを更新します。ありがとう。 – Sabobin