0

これはおそらく の経験不足によるものですが、NSOutlineViewこれを行う方法がわかりません。行を正しく保存/書き込み/挿入/削除するという点で完全に機能する追加ボタンを備えたNSOutlineView(優れたPXSourceListで実装された)があります。私は aNSTreeControllerを使用せず、バインディングも使用しません。次のコードを使用してエンティティを追加します。

- (void)addEntity:(NSNotification *)notification {
    // Create the core data representation, and add it as a child to the parent node
    UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
    [sourceList reloadData];
    for (int i = 0; i < [sourceList numberOfRows]; i++) {
        if (node == [sourceList itemAtRow:i]) {
            [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:i] byExtendingSelection:NO];
            [sourceList editColumn:0 row:i withEvent:nil select:NO];
            break;
        }
    }
}

追加ボタンを押すと、次のように新しい行が挿入されます。

ここに画像の説明を入力

クリックして行を選択し、 を押しenterて編集すると、次のようになります。 ここに画像の説明を入力

私の質問は、ユーザーエクスペリエンスを向上させるために、プログラムで同じ状態 (フォーカス、選択、強調表示) を初めて取得するにはどうすればよいですか?

4

1 に答える 1

1

このようなものは私にとってはうまくいきます:

- (void)addEntity:(NSNotification *)notification {
    // Create the core data representation, and add it as a child to the parent node
    UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
    [sourceList noteNumberOfRowsChanged];
    NSInteger row = [sourceList rowForItem:node];
    [sourceList scrollRowToVisible:row];
    [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
    [sourceList editColumn:0 row:row withEvent:nil select:YES];
}

rowForItem:繰り返しチェックする代わりに使用できますitemAtRow:

通常、データが実際に変更されていない限り、[sourceList scrollRowToVisible:...]新しい行が表示されず、noteNumberOfRowsChanged代わりに を使用できる場合にも使用します。reloadData

Mac の標準的な動作は、新しく作成されたアイテムのコンテンツを選択することなので、 を使用しますselect:YES

それでも問題が解決しない場合は、コード内で上記のスニペットが伝えていない何か他のことが起こっています...

一般に、新しいクラスを学習するときは、使用可能なメソッド (非推奨のメソッドを除く) をリストするドキュメント ページを最後まで読むか、少なくとも、試みているタスクで使用できるすべてのメソッドを読むことを強くお勧めします。実行する; クラスの機能をよりよく理解できるようになり、不適切/非効率的/洗練されていない方法を使用する可能性が低くなります。

于 2011-02-19T01:18:53.077 に答える