NSTableViewに追加した項目をすぐに編集可能状態にする方法(CoreData)

バグ修正ついでに、前から気になっていた箇所を修正。項目をNSTableViewに一覧表示しているのですが、新規に追加した項目を編集するときいちいちカラムをダブルクリックしなきゃいけないのが面倒なんです。項目を追加した時は普通すぐにデフォルトでセットされた値を編集するのだから、追加した時点でダブルクリックしないですぐに編集できるように変更したい!こんなこと簡単だと思っていたのですがプチハマリ。

NSTableViewを編集可能状態にするのはNSTableView editColumn: row: withEvent: select:だというのはあらかじめ調べてあったし、フレームワークにまかせきりの実装でも追加した時はちゃんと追加した項目が選択された状態になっていたので、ArrayControllerクラスで選択されている行にeditColumnメッセージを送信するだけでよいとタカをくくっていたのですが、

void add:(id)sender
{
  [supre add:sender];
  [aTableView editColumn:0 row:[self selectionIndex] withEvent:nil select:YES];
}

スーパークラスのaddメソッド終了時点ではまだTableView上では追加項目が変更されているわけではないようで上記の処理ではうまくいきませんでした。一瞬、選択していた行が編集可能になるのですがそのすぐ後新しく追加した項目がTableViewに追加されフォーカスを失ってしまいます。それなら!と、

[super add:sender];
NSArray* objs = [self arrangedObjects];
int row = [object indexOfObject:[objs lastObject]];
[self setSelectionIndex:row];
[aTableView editColumn:0 row:row withEvent:nil select:YES];

と、強制的に最後のオブジェクトを選択状態にしてみたのですがこれでも同じ。そもそも、格納されているオブジェクトのlastObjectが追加されたオブジェクトである保証はないからこれも正しくなさそう。結局、オブジェクトの追加を自前でコントロールするしかないという結論に達しました。

void add:(id)sender
{
   MyEntity* me = [NSEntityDescription insertNewObjectForEntityForName:@"MyEntity" 
        inManagedObjectContext:[self managedObjectContext]];
    NSString* meString = NSLocalizedString(@"newEntityDefaultValue","new one");
    [me setStringValue:meString forkey@"title"];
    [super addObject:me];
    int row = [[self arrangedObjects] indexOfObject:me];
    [self setSelectionIndex:row];
    [aTableView editColumn:0 row:row withEvent:nil select:YES];
}

いや、意外とハマりました。cocoaDevを検索してみたらほかにも手はあるみたいですが...

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/208

Comments