忍者ブログ

[PR]

2024年11月21日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

前回起動時の選択項目にチェックマークを付ける

2009年01月07日
アプリが一回起動した場合、あちらこちらへビューを移動させても、各テーブルの状態は保存されています。タブで他のビューに切り替えた後に元のビューへ戻っても、付けたチェックマークなどはそのまま残っています。ただ、一度アプリを終了し、再度アプリを起動してみるとビューの状態はリセットされています。そのため、もし前回起動した時の状態に戻したい場合には、アプリ終了時点の状態を保存し、ビューを表示する際に保存した状態に復旧する処理を自分で行わなければなりません。今回はその方法のうち、TableCellに関わる部分だけ説明します。まじめに説明するとこれだけでも相当な文量になりますので、他の部分はまた別の機会ということにします。さて、まずは下のコードを見てください。今回も某開発中ソフトのコードをそのまま貼付けています。セクションは1個だけで、3個のセルからなるテーブルで1個を選ぶとその1個だけにチェックマークが付くという処理をさせていた状態で、アプリを終了した場合を想定してみてください。再度立ち上げたので、テーブルを表示する時点では、そのテーブルを扱っているTableViewControllerのviewWillAppearが呼ばれます。ですから、ここで前回の状況へ回復させる処理を行わせるとしましょう。

- (void)viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];

for (int i = 0;i<3;i++) {

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];

UITableViewCell *cell = [myTableView cellForRowAtIndexPath:indexPath];

cell.accessoryType = UITableViewCellAccessoryNone;

}

NSInteger selectedRow = [[myDictionary objectForKey:@"level"]intValue];

NSIndexPath *oldIndexPath = [NSIndexPath indexPathForRow:selectedRow inSection:0];
UITableViewCell *oldCell = [myTableView cellForRowAtIndexPath:oldIndexPath];

oldCell.accessoryType = UITableViewCellAccessoryCheckmark;

}


注目ポイントは4行目の[NSIndexPath indexPathForRow:inSection:]です。これでセクション番号0(つまり一番上のセクション)の行番号i(ここでは一番上の0から三番目の2までが入ります)を示すindexPathが作れます。次の行ではこれを使ってセクション番号0、行番号iのセルへのポインタを獲得しています。そして、そのセルのアクセサリーを「なし(UITableViewCellAccessoryNone)」にしています。この一連の処理で全部のセルからチェックマークを外します(何かの間違いでチェックマークが残らないように、念のために一回全部消してしまっています)。そして今回は詳しく触れませんが、終了時に保存しておいたディクショナリーからどのセルを選択したかの記録を呼び出します。そこから前回選択したセルのポインタを取得、そのアクセサリーを「チェックマークあり(UITableViewCellAccessoryCheckmark)」にしたというわけです。

ちなみに、myTableViewはヘッダーファイル側で

IBOutlet UITableView *myTableView;

と宣言しておき、

@property (nonatomic,retain) UITableView *myTableView;

 
というプロパティにしてあり、さらにメソッドファイルで

@synthesize myTableView;


と@implementation直後に宣言してあり、deallocで


[myTableView release];

と書いてあり、InterfaceBuilder側での俗に言うところの紐付けもしてあるものとします。前提条件もこうして書くと長いものです。

2009.03.04追記
このビューが扱うデータが1つに限定される場合には、ViewWillAppearではなくViewDidLoadに記述しておけば問題ありません。選択させるデータは全く同一でも、複数のビューから呼び出して使い回しをする場合にはViewWillAppearでチェックマークの位置を付け直す必要があります。
PR
Comment
No title
プロパティの設定でつまづいていました。
大変助かりました。
ありがとうございます。
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字
Trackback
トラックバックURL: