0

これは簡単なはずですが、どれほど難しいことでしょう。

非常に単純なデータ モデルを持つドキュメント ベースのコア データ アプリケーションがあります。

NSTreeController によって制御され、NSOutlineView を通じて表示される、それ自体に対する親子関係を持つ「ノード」エンティティがあります。「ノード」には、NSArrayController によって管理される別のエンティティ タイプ「nodeProperties」との任意の (対 1 の) 関係もあります。両方のエンティティに NSManagedObject サブクラスがあります。ドキュメント クラスには、ツリー コントローラーとアレイ コントローラーの両方のインスタンスにバインドされたアウトレットがあります。

私の問題は、新しい「ノード」がアウトライン ビューのユーザー インターフェイス アクションによって作成されたときに、適切な (既存の) nodeProperties オブジェクトとの関係が設定されるようにする方法です。

私が試した/検討したアプローチ:

  1. ツリー コントローラに (その add:、addChild: アクションから) 「ノード」を作成させ、「ノード」サブクラスの awakeFromInsert メソッドで nodeProperties オブジェクトへの関係を設定します。問題は、「ノード」の awakeFromInsert 内から nodeProperties オブジェクトにアクセスする手段が見つからないことです。「適切な」nodeProperties オブジェクトはドキュメント クラスのメソッドから利用できますが、ノードの awakeFromInsert メソッドからドキュメント オブジェクトにアクセスすることは MVC の原則を破るように思われ、共有ドキュメント オブジェクトが常に安全ではないことを読みました。およびドロップ操作(私の場合、新しいノードオブジェクトも作成されます)

  2. ドキュメント クラスに add: および addChild: アクション メソッドを記述し、ツリー コントローラではなくエンド ユーザー アクションからこれらを呼び出します (私のドラッグ アンド ドロップ サポートはドキュメント クラスにもあります)。次に、これらのメソッド内からツリー コントローラの add: メソッドと addChild: メソッドを呼び出し、新しく作成されたノードに nodeProperties 関係を設定します。問題は、新しく作成されたノードへの参照をツリー コントローラに要求する方法がわからないことです。selectedObjects メソッドを使用して親を取得し、追加の前後で親の子を比較して新しいノードを取得しようとしました。しかし、現時点では子のコンテンツは変更されていません。おそらく更新が遅れているのでしょうか?

  3. 2 の変形として、ツリー コントローラの add:/addChild: メソッドをまったく使用しないでください。代わりに、ツリー コントローラの selectedOjects を使用してドキュメントの add:/addChild: メソッドにノード エンティティ オブジェクトを作成し、親を取得します。ツリーコントローラーの背後で何かをしているように見えるので、これはあまり好きではなく、ルートオブジェクトを作成するたびに setContent: を行う必要があります。

  4. 新しく作成されたノードの作成を観察する可能性を検討しましたが、それを達成するために何を観察すればよいかわかりません。

誰かが以前にこのようなことをしたにちがいありません - しかし、私は役に立ちませんでした。すべてのヘルプ、アドバイス、ガイダンスは大歓迎です。

4

1 に答える 1

0

わかりましたので、多くのトロールと実験の結果、答えは 3 の変形でした。ドキュメントは新しいノードを作成し、その必須の関係を add および addChild アクション メソッドに入力してから、メソッドを使用してノードをツリー コントローラーに挿入します。

NSTreeController insertObject:atArrangedObjectIndexPath:

興味のある方のために説明すると、これはドキュメント クラスの addChild メソッドです。私のデータモデルからのいくつかの詳細があります

- (IBAction)addChildAction:(id)sender
{
    NSArray *indexPaths = [nodeTreeController selectionIndexPaths];
    NSArray *selectedObjects = [nodeTreeController selectedObjects];
    for (NSUInteger i = 0; i < [indexPaths count]; i++)
    {
        QVXpandNode *parentNode = [selectedObjects objectAtIndex:i];
        if ((parentNode) && ([parentNode.isMaster boolValue])) // can only add nodes under the master node
        {
            QVXpandNode *createdNode = [self createPopulatedNode];
            // Dont belelieve below is safe when >1 selected,
            // since adding a new node will result in the tree paths changing?
            // Hmmm but I do want to support multiple selection addition??
            [nodeTreeController
                insertObject:createdNode
                atArrangedObjectIndexPath:[[indexPaths
                    objectAtIndex:i] indexPathByAddingIndex:[parentNode.children count]]];
        }
    }
}

アクションを呼び出す前に 1 行以上が選択された場合、2 番目以降の子を正しいパスに配置するかどうかわからないことがわかります。

addSibling メソッドは、最後のインデックス パス値を計算する必要があるため、少し複雑ですが、それ以外は同様です。誰かが見たい場合は再現できますが、新しいツリー ノードに必須の関係を設定するための鍵は、ドキュメント クラスでそれを行い、ツリー コントローラーに挿入するツリーの場所を正確に伝えることです。

于 2014-06-24T22:21:33.097 に答える