ページ

2008年2月7日木曜日

スクラップブックその3 - 削除

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

選択した画像を削除する。削除はDeleteキーで行う。

まずビューでキー入力をハンドリングする。

WorkView.m


- (BOOL)acceptsFirstResponder
{
return YES;
}
- (void)keyDown:(NSEvent *)theEvent
{
}
- (void)keyUp:(NSEvent *)theEvent
{
if ([theEvent keyCode] == 117 && _selected_item) {
[_controller deleteItem:_selected_item];
_selected_item = nil;
[self setNeedsDisplay:YES];
}
}

キーボード・イベントを取り扱う場合には acceptsFirstResponder をオーバライドし YESを返す(ヒレガス本参考)。
次にdeleteキーが押されたかを keyUp: で判定する。keyDown: で処理する場合は、押しっぱなしだと何度も呼び出されるので1回だけ呼出される keyUp:を使う。MyController#deleteItemを呼び出してモデルを削除した後、選択を解除し再描画する。


以下は MyController内でのモデル削除の処理コード。

MyController.m

-(void)deleteItem:(Item*)item
{
NSString *filepath = [_path_to_save stringByAppendingPathComponent:item.filename];
[_items removeObject:item];                         // (1)
NSManagedObjectContext* moc = [_app_delegate managedObjectContext];
[moc deleteObject:item];                           // (2)

NSFileManager *fm = [NSFileManager defaultManager];
[fm removeFileAtPath:filepath handler:nil];                  // (3)
}

処理は3つ。(1)配列から削除、(2)CoreDataから削除、(3)画像ファイルの削除。
(本当はちゃんとエラー処理を入れてトランザクションを形成すべし)。