問題タブ [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.
cocoa - 非同期データを含む NSBrowser / NSTreeController
REST API からのデータを表示する必要がある NSBrowser があります。この API は結果を返すのに時間がかかる場合があるため、バックグラウンドでネットワーク トラフィックを処理すると便利です (遅延フェッチ)。サーバー側の変更を反映するために、サブツリーを更新する必要がある場合があります。
私は2つの異なるアプローチを試しました:
- NSBrowserDelegate を使用します。[browserDelegate browser:child:ofItem:] などの関数が、まだ読み込まれていないデータを要求した場合、0 カウントを返し、バックグラウンド処理を開始します。データが利用可能になったら、列をリロードします (あまり効率的ではありません。新しいデータが入ってくると、ユーザーの選択が台無しになります)。
- NSTreeController を使用します。ブロッキング/同期アプローチを使用して、これをうまく機能させました。ただし、モデルを更新するたびに、NSBrowser はツリーをリセットし、選択を親に移動します。[obj mutableArrayValueForKey] アプローチを試しました。[treecontroller insertObject:atArrangedObjectIndexPath:] アプローチを試しました。「選択を保持」フラグを切り替えました。「挿入時に選択」を切り替えました。私が何をしても、NSBrowser は関連するサブツリーだけをきれいに更新したくありません。
結論: NSBrowser にデータを非同期的にロードするためのベスト プラクティスは何ですか?
macos - NSTreeviewController にオブジェクトと子を追加する
NSTreeviewController クラスで最大 2 日間苦労しました。これが私のコードです
TreeController キーパスを「子」として追加しました。
実際、私のアプリケーション スコープは、ファイル ディレクトリを表示することです。次のように
画像を添付しました
つまり、ここにファインダーが表示されます。
ここに追加するにはどうすればよいですか。助けてください。私は待っています。前もって感謝します。私の間違った英語でごめんなさい
objective-c - 新しく作成された NSManagedObject から必須の関係を設定するコア データ
これは簡単なはずですが、どれほど難しいことでしょう。
非常に単純なデータ モデルを持つドキュメント ベースのコア データ アプリケーションがあります。
NSTreeController によって制御され、NSOutlineView を通じて表示される、それ自体に対する親子関係を持つ「ノード」エンティティがあります。「ノード」には、NSArrayController によって管理される別のエンティティ タイプ「nodeProperties」との任意の (対 1 の) 関係もあります。両方のエンティティに NSManagedObject サブクラスがあります。ドキュメント クラスには、ツリー コントローラーとアレイ コントローラーの両方のインスタンスにバインドされたアウトレットがあります。
私の問題は、新しい「ノード」がアウトライン ビューのユーザー インターフェイス アクションによって作成されたときに、適切な (既存の) nodeProperties オブジェクトとの関係が設定されるようにする方法です。
私が試した/検討したアプローチ:
ツリー コントローラに (その add:、addChild: アクションから) 「ノード」を作成させ、「ノード」サブクラスの awakeFromInsert メソッドで nodeProperties オブジェクトへの関係を設定します。問題は、「ノード」の awakeFromInsert 内から nodeProperties オブジェクトにアクセスする手段が見つからないことです。「適切な」nodeProperties オブジェクトはドキュメント クラスのメソッドから利用できますが、ノードの awakeFromInsert メソッドからドキュメント オブジェクトにアクセスすることは MVC の原則を破るように思われ、共有ドキュメント オブジェクトが常に安全ではないことを読みました。およびドロップ操作(私の場合、新しいノードオブジェクトも作成されます)
ドキュメント クラスに add: および addChild: アクション メソッドを記述し、ツリー コントローラではなくエンド ユーザー アクションからこれらを呼び出します (私のドラッグ アンド ドロップ サポートはドキュメント クラスにもあります)。次に、これらのメソッド内からツリー コントローラの add: メソッドと addChild: メソッドを呼び出し、新しく作成されたノードに nodeProperties 関係を設定します。問題は、新しく作成されたノードへの参照をツリー コントローラに要求する方法がわからないことです。selectedObjects メソッドを使用して親を取得し、追加の前後で親の子を比較して新しいノードを取得しようとしました。しかし、現時点では子のコンテンツは変更されていません。おそらく更新が遅れているのでしょうか?
2 の変形として、ツリー コントローラの add:/addChild: メソッドをまったく使用しないでください。代わりに、ツリー コントローラの selectedOjects を使用してドキュメントの add:/addChild: メソッドにノード エンティティ オブジェクトを作成し、親を取得します。ツリーコントローラーの背後で何かをしているように見えるので、これはあまり好きではなく、ルートオブジェクトを作成するたびに setContent: を行う必要があります。
新しく作成されたノードの作成を観察する可能性を検討しましたが、それを達成するために何を観察すればよいかわかりません。
誰かが以前にこのようなことをしたにちがいありません - しかし、私は役に立ちませんでした。すべてのヘルプ、アドバイス、ガイダンスは大歓迎です。
objective-c - NSOutlineView + NSTreeController で選択したノードのフルパスを取得する方法
このリンクから NSOutlineview を参照しました。選択した値に基づいて、すべての値を動的にロードします。ここでは、パスを取得しながら問題を構築します。
同様に、フォルダパス。(例: D:/NewFolder/Test/blah/blah1
同じように、選択した子のフルパスを親から取得する必要があります。画像では、プロジェクトを選択しました。したがって、次のようにパスを取得する必要があります。
私のコードは
これを行う方法。任意のボディ pls はこれを解決するのに役立ちます。前もって感謝します。
core-data - NSOutlineView 行のスタイリング
ビューベースのNSOutlineViewにコンテンツを提供するNSTreeControllerを備えたドキュメントベースのCore Dataアプリがあります。最終用途が変更できるデータモデルの永続的な「変換可能な」 NSColor および NSFont 属性に基づいて、行を「スタイリング」(テキストの色、背景色などを設定) しています。新しい行がポップアップすると、データ モデルで設定された色/フォントで表示されます。行の背景色を設定するデリゲート/データソース コードは次のとおりです。
ただし、スタイル属性が変更された場合、関連する表示行を新しいスタイル値で再描画する必要があります。「スタイル」属性が変更されるたびに、NSNotificationCenter を使用して、変更されたスタイルで行を再描画する必要があるモデル オブジェクトと共に、Outline ビュー デリゲートに通知を送信しています。これは、通知を受け取るデリゲートのコードです。
ここで想定しているのは、ツリー コントローラーをナビゲートしてモデル オブジェクトを表すツリー ノードを見つけ、そのツリー ノードの行を再描画するようにアウトライン ビューに要求できることです。これは、オブジェクトを見つけるためにツリーをたどるツリーコントローラーの「追加」コードです。非常に効率的ではありませんが、別の方法はないと思います。
したがって、これが機能して行が再描画される場合と、そうでない場合があります。デリゲート メソッド "styleHasChanged:" は常に呼び出され、ツリー コントローラーは常に対応するツリー ノード (実際には NSTreeNode のサブクラス) を返します。しかし、多くの場合、アウトライン ビューはツリー ノードを認識せず、行は再描画されません。ツリー コントローラーが、以前にアウトライン ビューに与えたものとは異なるツリー ノード オブジェクトを返したようです。しかし、奇妙なことに、それが機能し、正しい行が新しい背景色で再描画されることがあります。行を非表示に折りたたんで再度開くと、正しく再描画されます。
なぜそれが時々機能し、他の時には機能しないのか、誰にも分かりますか?
アウトライン ビューが KVO を使用してこのスタイル設定を自動的に行うように、色/フォント属性を何らかの方法で行と列にバインドできると便利ですが、それは可能ではないと思います。
objective-c - NSOutlineView でルート ノードのみを展開する
NSOutlineViewでルート項目のみを展開するという単純な問題を解決しようとしていますが、うまくいきません。すべてのアイテムと選択したアイテムを展開できますが、ルート ノードだけを展開する方法を正確に特定する方法がわかりません。アウトラインビューにはフォルダーのツリーが表示され、ルートフォルダーのすぐ下で使用可能なフォルダーを表示したいのですが、フォルダーの子を展開したくありません。
現在、NSTreeController の selectionIndexPath を設定してから、outlineview で選択を展開しようとしています。
これは動作しません。これを正しく解決する方法についての提案は大歓迎です。
乾杯、トロンド
解決策: 私がすでに持っていたものと@PaulPattersonの提案の次の組み合わせは完全に機能します:
cocoa - NSOutlineView/NSTreeController のノード移動のサポートを元に戻す
にNSOutlineView
バインドされている がありNSTreeController
ます。アウトラインビューの項目(複数選択)は、ドラッグ&ドロップで並び替えができます。
アウトライン ビューの並べ替えを元に戻す/やり直す機能を追加したいと考えています。これを行う方法を示すサンプルコードを誰か指摘できますか?
変更を元に戻すと、ツリー コントローラーの構造が変更され、残りのノードのインデックス パスが元の位置に戻されるため、移動したツリー ノードのインデックス パスを再構築するのに苦労しています。
このコードを使用して、最初にノードを移動します。
moveNodes:
単一のインデックス パスのみを引数として取る方法に注意してください。複数のノードを含む選択の場合、すべてを一度に戻すことはできませんが、変更を 1 つずつ再生する必要があります (インデックス パスを無効にするという上記の問題が発生します)。
macos - NSTreeController は、ノードを削除するときに遅延を生成します
NSTreeController
+を使用NSOutlineView
して大きなツリー (1K 以上のノード) を表示します。ツリーは、隣接リストを使用して構築されます。InNSTreeController
は LazyFetching をオンにします。ノードを削除しようとすると、NSTreeController
すべてのフォールト子孫ノードの処理が開始されます。ツリーが大きい場合、遅延が発生します。
フルフィルのログは次のとおりです。
それは正常な動作ですか?どうすれば防ぐことができますか?