問題タブ [nstreecontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
0 に答える
427 参照

objective-c - CoreData と NSTreeController

現時点では、コア データのバックエンドである nstreecontroller に固執しています。私の問題は、フィールドを編集したり、新しい行を追加したりしても、再配置がトリガーされないことです。

構造:

  • コンテンツの準備をオンにして構成され、遅延フェッチを使用する NSTreeController。コントローラーは appDelegate.managedObjectContext および appDelegate.mySortDescriptor (内部に nssortdescriptor を含む配列を返す関数) にバインドされます。
  • 列が treecontroller.arrangedObjects.name にバインドされている Outlineview。Outlineview も SourceList モードです。
  • アイテムと1対多の関係(子)と1対1の関係(親)を持つ「アイテム」と呼ばれるエンティティ。そしてもちろん、表示値を保持する「name」というフィールドがあります。
  • 2つのストレージ。1 つはメモリに保持するだけで、デフォルトのものです。一時ストレージは、ルート エンティティをセットアップするために使用されます (単に「視覚的」であるため、格納したくありません)。

ここまでは、次を除いてすべて問題ありません。

  • 起動時に sortdescriptor が読み込まれますが、実行されません (自分自身を再配置関数と呼ぶ必要があります)。
  • コアデータを変更しないと、再配置メソッドがトリガーされます

私はすでに自分で問題を解決しようとしましたが、次の結果が得られました。

  • 「遅延フェッチを使用する」を削除すると、問題 o_O が解決されますが、誰がそれを望んでいますか?!
  • この問題は、outlineView:setObjectValue:forTableColumn:byItem: (outlineview データソース) でrearrange を呼び出すと解決します。しかし、これが呼び出される理由がよくわかりません (coredata を使用しているので、呼び出されるべきではありませんか?)。一方、rearrange を呼び出すと、ソートが再び台無しになることがよくあります (例: 値を変更していないセルを保存した場合)。

それが、あなたが何か間違ったことをしているという事実に直面しなければならないと私が自分に言い聞かせた理由です:)

私が実際に持ちたいのは次のとおりです。

  • CoreData バックエンド
  • Outlineview は常にソートされます (ユーザーは変更できません)。
  • ルート オブジェクトの保存をスキップする
  • 少ない仕事はいつでも大歓迎

どうもありがとう、よろしく、マチュー・リオロ

PS: ヒントも大歓迎です

0 投票する
2 に答える
1100 参照

objective-c - NSOutlineView を効率的に平坦化するには?

NSTreeController にバインドされている NSOutlineView があります。NSTreecontroller (myTreeController) のコンテンツは、次のコマンドを使用してデータで設定されます: [self.myTreeController setContent:self.myArrayOfFiles]; 配列の内容は、NSTreeNode サブクラス (TKnode) を使用して追加された NSTreeNode 親オブジェクトと子オブジェクトで構成されます。

[TKnode treeNodeWithRepresentedObject:myRootObject].

これは非常にうまく機能し、私の NSoutlineView を正しく表示します。しかし、NSOutlineView のコンテンツを繰り返し処理したい場合は、それを平坦化し、オブジェクトを配列に格納する必要があります。これは、私が持っているソリューションが最適ではなく、エラーが発生しやすい可能性があるため、助けが必要な場合があります。

最初に、次を使用して NSTreeController のコンテンツを返します。

これは、ツリー構造を保持するサイズ 1 の NSTreeControllerTreeNode 配列を返します。次に、childNodes メソッドを使用して、ツリー構造の最初のレイヤーにアクセスします。

子の子は、次のメソッドを使用して再帰的にアクセスされます。

これは機能し、NSTreeNode ではなく、関心のあるオブジェクトを含むすべてのオブジェクトを含む配列を返します。これは、NSTReeController と NSTreeNodes を操作する方法ですか? より良い方法はありますか?私が最初に NSTreeNode と NSTreeController を使用したかった理由は、NSTableView で慣れ親しんだ sorting や ArrangeObjects など、既に実装されているメソッドの一部を無料で取得するためでした。しかし、NSTreeController コンテンツにアクセスするために使用する方法は正しくないようです。を使用しarrangedObjectsて NSTReeController のコンテンツを取得する必要がありますか、それとも別のアプローチを使用する必要がありますか? NSOutlineView を正しくフラット化する方法についての提案は大歓迎です。

ありがとう!乾杯、トロンド

0 投票する
1 に答える
1100 参照

cocoa - ビューの選択が変更されたときにカスタム NSViewController presentedObject が更新されない

NSOutlineViewDataSource でもあるカスタム NSViewController があります。また、ビュー コントローラーのインスタンスにデータ ソースとしてバインドされた NSOutlineView と、カスタム ビュー コントローラーの view: プロパティにバインドされた NSOutlineView を含むウィンドウもあります。

コントローラーはアウトラインビューをうまく塗りつぶします。ただし、ビュー内の選択は、コントローラーのpresentedObject プロパティを自動的に更新しません。presentedObject の変更をトリガーしているように見える唯一のことは、 setRepresentedObject: を直接呼び出したときです...これは目的を無効にします。

なぜそれが考えられるのでしょうか?presentedObject自動的に更新されるはずですよね?前もって感謝します...

0 投票する
2 に答える
1001 参照

cocoa - NSTreeController を NSOutlineViewDataSource にバインドすることは可能ですか?

NSOutlineView に表示したい階層データ モデルがあります。データを提供し、選択と他のビューへのバインドを処理するために、ツリー コントローラーをアウトライン ビューにバインドしています。

ただし、モデル内のデータの一部のみをアウトライン ビューに表示したいだけです。(階層内の各オブジェクトには子オブジェクトの配列がありますが、これらの子オブジェクトの一部のみがツリー内のノードの子ノードとして表示されるようにしたいと考えています。) ツリー コントローラーにフィルター述語をアタッチできたらいいのにと思います。 、しかし NSOutlineView はフィルター述語をサポートしていないようです。

この設計には、データ モデルをフィルター処理するための NSOutlineViewDataSource と、データ ソースとアウトライン ビューにバインドされた NSTreeController が必要だと思います。ただし、ツリー コントローラー (コンテンツ配列、コンテンツ オブジェクト、コンテンツ セットなど) のバインド アウトレットはどれも、データ ソースのバインドに適していないようです。

何か案は?前もって感謝します...

0 投票する
1 に答える
663 参照

cocoa - コードを NSTreeController / NSOutlineView 選択変更イベントにアタッチする方法はありますか?

階層データ モデルへのアクセスを提供する NSTreeController にバインドされた単純な NSOutlineView があります。これをマスター/詳細ビューにしたいと思います。選択したノードに関する情報がいくつかのバインドされたビューに表示されます。しかし、私はたくさんの行き止まりにぶつかっています:

1) NSOutlineView のドキュメントには次のように書かれています。

次のような一部のデリゲート メソッドは、まだ NSOutlineViewDelegate プロトコルに移行されていません。

OutlineViewSelectionDidChange:

OutlineViewSelectionIsChanging:

...これは、まさに私がトラップしたかったイベントです。ドキュメンテーションは日付が付けられていませんが、「まだ移行されていません」は「息を止めないでください」と読むべきだと思います。

2) アウトライン ビューを IBOutlet にアタッチすると、一部の選択イベント処理が提供されますが、マウス クリック時のみです。キーボードのカーソル キーを使用して階層をナビゲートしても、イベントは発生しません。

3) NSTreeController は、この本当に基本的な機能をサポートしていないようです。

それで...何か足りないのですか?または、NSTreeController をサブクラス化するよりも、このタスクを達成する簡単な方法はありますか?

前もって感謝します...

0 投票する
0 に答える
340 参照

objective-c - NSTreeController を使用して列挙されたオブジェクトを正しく表示する方法

NSTreeController の使用方法を理解しようとしています。NSTreeController を介して NSOutlineView に送信されるディレクトリの内容を反復処理するメソッド (SourceView の例のクラスとメソッドの一部を以下に示します) を追加すると、ただし、NSOutlineView は最初のオブジェクト (ルート オブジェクト) のみを表示します (以下のスキームで確認できます)。

クラス NSTreeController メソッド:

ディレクトリの列挙オブジェクトを表示する方法:

私の間違いはおそらく、NSTreeController が単純なオブジェクト (ファイル) とディレクトリ (フォルダー) を区別しないことです。

ここに画像の説明を入力

ただし、NSTreeController なしで NSOutlineView を埋めると、すべてのコンテンツが正しく表示されます。

ここに画像の説明を入力

注: addFolder メソッドを使用する場合 (SourceView の例では、他のオブジェクトの親グループを作成するために使用されます)、次のすべてのオブジェクトが前のサブグループとして表示されます。

これらの方法でフォルダの内容を正しく表示するのを手伝ってもらえますか?

0 投票する
1 に答える
411 参照

objective-c - NSOutlineView の内容を更新する

NSMutableArray (arrayOfFiles) にバインドする NSTreeController によって制御されるコンテンツを表示する NSOutlineView があります。配列には NSTreeNode オブジェクトが含まれており、そこでは、presentedObject (Fileobject クラス) が多数の ivar を保持しています。特定のオブジェクトの「方向」という名前の ivar を編集および更新したいと考えています。オブジェクトごとに保存した NSIndexPath を使用して、目的のオブジェクトを取得することができました。

これは問題なく動作しますが、NSIndexPath で抽出したばかりのオブジェクトを更新するときに問題が発生します。次のクラッシュ:[self.myOutlineViewController.myTreeController removeObjectAtArrangedObjectIndexPath:myIndexPath];エラーメッセージとともに

ここでキーと値のコーディングに何か問題があることは理解していますが、それが何であるかを確認できません。Apple のすべての例で解決策を探してみましたが、NSTreeController と NSTreeNode を使用していない例しか見つかりません。私の考えは、1) indexpath でオブジェクトを抽出する 2) 抽出されたオブジェクトを編集する 3) indexpath で現在のオブジェクトを削除する 4) command を使用して、新しく編集したオブジェクトを indexpath に挿入することでした[self.myOutlineViewController.myTreeController insertObject:myNode atArrangedObjectIndexPath:myIndexPath];。ivar だけではなくオブジェクト全体を置き換える場合、キー値コーディングを使用してオブジェクトを置き換える方法がわかりません。

私が間違っていることについての提案と、これを解決する方法についての提案は高く評価されています。

乾杯、そしてありがとう!トロンド

0 投票する
1 に答える
98 参照

cocoa - NSTreeController へのバインディングを持つ NSComboBox

私は、子と NSComboBox を持つ NSTreeController/NSOutlineView を持っています。子ではなく、コンボボックスの最上位オブジェクトのみを表示したいと思います。これを行う方法がわかりません。助言がありますか?

0 投票する
1 に答える
1529 参照

cocoa - CoreData を使用して NSOutlineView の NSTreeCcontroller を設定する

私のモデルは次のようになります。

モデル

私のテスト プロジェクトでは、次の 2 つの方法があります。

これにより、次のようなアウトライン ビューが表示されます。

結果

xib のツリー コントローラー オブジェクトでは、Children Key Path を「children」に設定しました。管理オブジェクト コンテキスト (moc) は、ファイル所有者の moc にバインドされます。アウトライン ビューのテーブル列の値は、「名前」のモデル キー パスを持つ NSTreeController の ArrangeObjects にバインドされています。

ご覧のとおり、ルート アイテムの下にのみ表示されるはずの子アイテムのエントリが重複しています。

私は何を間違っていますか?

サンプル プロジェクトは、サンプル プロジェクトのリンクにあります。

ありがとうございました。