質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

2回答

6551閲覧

UITableViewのチェックマークがスクロールすると消えてしまう

mm--_--mm

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

1クリップ

投稿2015/09/01 08:26

いつもお世話になっております。

題名の通り、UITableViewでチェックマークをつけた後、スクロールしてから戻ってみるとチェックマークが消えてしまいます。
下記のコードに何を加えたら消えないようにできるか、わかる方がおりましたら教えてください。

よろしくお願いいたします。

objective

1- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 2 static NSString *CellIdentifier = @"Cell"; 3 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 4 if (cell == nil) { 5 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 6 cell.selectionStyle = UITableViewCellSelectionStyleNone; 7 } 8 9 // Configure the cell... 10 11 if ([[array objectAtIndex:indexPath.row] isEqualToString:cell]) { 12 cell.accessoryType = UITableViewCellAccessoryCheckmark; 13 } else { 14 cell.accessoryType = UITableViewCellAccessoryNone; 15 } 16 17 cell.textLabel.text = [[array objectAtIndex:indexPath.row] stringByDeletingPathExtension]; 18 return cell; 19}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

UITableViewCellはスクロールされて画面から見えなくなると、これから見える別のCellとして再利用されてしまいます。その際にチェックをつけたという情報はなくなってしまいます。
そのため何番目のCellがチェックされているかという情報を別途保存しておき、そのCellが再び見えるようになるときにCheckをつけてやるという処理が必要です。

なので

どこかにindexを保存しておくarrayを作っておき

ObjectiveC

1@interface ViewController () 2 3// 選択されたcellのindexPath.rowを保存しておくarray 4@property (nonatomic, readwrite) NSMutableArray *array; 5 6@end

didSelectRowAtIndexPathで選択されたCellのindexを覚えておきます。

ObjectiveC

1- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 2 3 UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 4 5 // checkmarkがなかったらcheckmarkつけてarrayに保存 6 if (cell.accessoryType == UITableViewCellAccessoryNone) { 7 cell.accessoryType = UITableViewCellAccessoryCheckmark; 8 [self.array addObject:@(indexPath.row)]; 9 } else { 10 // checkmarkがあったらcheckmark外してarrayから削除 11 cell.accessoryType = UITableViewCellAccessoryNone; 12 [self.array removeObject:@(indexPath.row)]; 13 } 14 [tableView reloadData]; 15}

そしてCellが再描画されるときにcheckをつけたCellのindexだったらチェックをつける

ObjectiveC

1- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 2 3 static NSString *CellIdentifier = @"Cell"; 4 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 5 if (cell == nil) { 6 cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; 7 cell.selectionStyle = UITableViewCellSelectionStyleNone; 8 } 9 10 // arrayにindexが保存してあったらcheckmarkつける 11 if (self.array && [self.array containsObject:@(indexPath.row)]) { 12 cell.accessoryType = UITableViewCellAccessoryCheckmark; 13 } else { 14 cell.accessoryType = UITableViewCellAccessoryNone; 15 } 16 cell.textLabel.text = [NSString stringWithFormat:@"%ld", (long)indexPath.row]; 17 return cell; 18 19}

のようにすればスクロールしてもチェックマークはついたままになるはずです。

もしかしたら下記はそれを意図した処理だったのかもしれませんが、判定にミスっていて常にUITableViewCellAccessoryNoneの処理を通っているためチェックが消えてしまったのではないかと思います。

ObjectiveC

1if ([[array objectAtIndex:indexPath.row] isEqualToString:cell]) {

投稿2015/09/01 18:57

編集2015/09/04 16:50
jollyjoester

総合スコア1585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/09/02 02:55

ご回答いただきありがとうございます。 教えていただいたコードを試してみると、最初にチェックマークをつける時は問題ないのですが、消す時、消してからもう一度つける時は2回タップしないとチェックマークがついたり消えたりしてくれません... この問題の解決方法はあるのでしょうか?
jollyjoester

2015/09/04 16:52

返信が遅くなってしまいすみません。 didSelectRowAtIndexPathに[tableView reloadData];の一行を追加することで修正できました。回答の方も編集したのでご覧ください:-)
mm--_--mm

2015/09/11 00:10

返信が遅くなってしまい申し訳ありません。 修正したコードを参考にさせていただいた所、無事解決することができました。 ご回答いただきありがとうございました。
guest

0

コードから察するに本来arrayにはNSStringが入っているんじゃないんですか?

if ([[array objectAtIndex:indexPath.row] isEqualToString:cell]) {

だとcellと比較してますがこれは意図してるんでしょうか?

投稿2015/09/01 13:21

toki_td

総合スコア2850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2015/09/02 00:07

ご回答いただきありがとうございます。 そこに関しては訳も分からずただ適当に書いてしまったところです... ですので、特に意図していることはないです...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問