問題タブ [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.
nsoutlineview - NSXMLDocument で NSTreeController setcontent を使用できますか?
単純な plist (xml) ファイルの内容を Outlineview に表示しようとしています。
ファイル データを NSXMLDocument または NSDictionary に取得したら、この既存の構造を使用して TreeController を設定することはできますか? 私が見つけることができるすべてのコード例は、すべてのノードとコンテンツを解析して再構築します。これはNSXMLDocumentですでに確立されていませんか?
ありがとう
奪う
objective-c - NSArrayのNSDictionaryを表示するのに最適なものは何ですか?
NSDictionary
各キーがオブジェクトを参照しているのですNSArray
が、Mac OSX10.5のCocoaAPPにコンテンツを表示したいのですが、これに対する最善の解決策は何ですか?
多分NSTreecontroller
?
cocoa - 与えられたモデルオブジェクト、NSTreeControllerでインデックスパスを見つける方法は?
を表すモデルオブジェクトが与えられNSTreeController
た場合、ツリー内でそれらのインデックスパスをどのように見つけ、その後それらを選択しますか?これはやみくもに明らかな問題のようですが、私はそれへの参照を見つけることができないようです。何か案は?
objective-c - NSTreeControllerがCoreDataの子属性を設定していません
NSTreeControllerはコアデータの親属性を設定していますが、子属性は設定していません。
私はこのようなコアデータモデルを持っています
次に、NSOutlineViewとNSTreeControllerを使用して表示しています。メソッド-[NSTreeControllerinsertObject:atArrangedObjectIndexPath:]を使用してLeafを挿入しようとすると、leafsの親プロパティは正しく設定されますが、親のGroup.childrenプロパティはnilに設定されたままになります。
プロジェクトを実行すると、コンソールに次の警告が表示されます
childrenKeyPathはInterfaceBuilderで設定されていますが、NSManagedObjectサブクラスのSavedItem、SavedGroup、およびSavedLeafがあるのになぜNSMutableDictionaryを使用しているのですか。いくつかの例をダウンロードしましたが、私がそうではないのに、彼らが何をしているのかわかりません。
objective-c - NSTreeController または NSOutlineView でオブジェクトの NSIndexPath を取得するクリーンな方法は?
ドキュメントに目を通した後、 内のオブジェクトのインデックス パスNSOutlineView
またはNSTreeController
バインド先のオブジェクトのインデックス パスを取得する合理的に簡単な方法を見つけることができません。その結果、インデックス パスを必要とする何か (たとえば、ツリーから特定のアイテムを削除する) を行う必要があるときはいつでも、自分でインデックス パスをアセンブルしようとする非常に醜いコードを書くことになりました。
これを行うより良い方法はありません[[NSIndexPath indexPathWithIndex:<blah>] indexPathByAddingIndex: <blah>]
か?
core-data - マスター-2つのNSTreeController、コアデータとバインディングを使用する詳細アプリケーション
マスター(NSOutlineView + NSTreeController)と詳細(NSOutlineView + NSTreeController)のセットアップを使用してマスター-詳細アプリケーションを実行しようとすると、問題が発生します。
これは、AppleのAbstract-Treeサンプルアプリに基づく最も単純なアプリケーションです。
https://s3.amazonaws.com/applicationtests/AbstractTree-MasterDetail.zip
基本的に、ツリーノードを使用する左側のプロジェクトブラウザと、プロジェクトブラウザの選択に依存する詳細ツリーを表示する右側の詳細ブラウザがあります。
私の設定は簡単です。
マスターNSOutlineViewは、CoreDataエンティティプロジェクトノードを渡すマスターNSTreeControllerにバインドします。詳細NSOutlineViewは、CoreDataエンティティの詳細ノードを渡すDetailNSTreeControllerにバインドします。
どちらも木です。
プロジェクトノードエンティティには詳細ノードとの関係があり、選択に応じてプロジェクトツリーに詳細ツリーを表示できます。
私が抱えている問題は、contentObject inDetailNSTreeControllerをマスターNSTreeController選択にバインドするときです。
詳細NSTreeControllercontentObjectはマスターNSTreeControllerselection.detailNodeにバインドします
マスターツリーoutlineViewで選択を変更するたびに、詳細NSTreeControllerは、割り当てが解除されることのないNSTreeControllerTreeNodesを作成します。
基本的に、マスターコントローラーの選択が変更されるたびに、詳細NSTreeContrllerは、割り当てが解除されることのない新しいNSTreeControllerTreeNodeオブジェクトの新しいセットを作成します。
Instruments Allocationツールをご覧ください。選択を変更するたびに、新しいノードが作成されます。すべてのマスターノードを削除した後でも、ノードは割り当てられたままです。
マスターコントローラーの選択を変更して新しいnibファイルをリロードするNSViewControllerを準備しようとしましたが、これは大きなオーバーヘッドのように思えます。
contentObjectバインドが別の値に変更されたときに、作成されたNSTreeControllerTreeNodesを破棄する方法を知っている人はいますか?
ありがとう。
cocoa - バインディングによる NSOutlineView のグループ化
うまくいく方法がいくつか思いつくので、これは一種のベスト プラクティスの質問です。
アウトラインビューを実装したい。OmniFocus に実装したいとしましょう (私の目的は非常に似ています)。
(サイドバーではなく、そのスクリーンショットのメイン ペインのアウトライン ビューを参照します。)
したがって、私のデータ型はtaskです。どのタスクにもサブタスクを含めることができます。各タスクには、1 つまたはゼロの親タスクがあります。アウトライン ビューで表示するための従来のデータ モデルですね。
しかし!ユーザーが選択したプロパティによって、これらのタスクを視覚的にグループ化できるようにしたいと考えています。マイルストーン、割り当てられたユーザー、またはコンポーネントごとにグループ化できます。これらはたくさんあります。このグループ化は、この OmniFocus スクリーンショットの「受信ボックス」、「ホーム」、および「仕事」の項目と同様に、階層の最上位のアウトライン ビューに表示されます。
したがって、グループ化を表示するには、組み込みの NSOutlineView メソッド (デリゲート メソッド) を使用してグループ セルを描画する必要があることは明らかですoutlineView:isGroupItem:
。問題は、このセットアップでは、アウトライン ビューの各アイテムが、接続先のデータ モデルのアイテムによって表されると想定していることです。そのため、タスクとグループ ヘッダーの両方をデータ モデルで表す必要があります。
したがって、自分のタスクを表す Core Data テーブルにバインドするだけではダメです。バインディングをすべてやめて、古いスタイルのデータ ソース メソッドに戻ることもできますが、その場合、多くの有用なものが失われます。それで、中間点はありますか?
たとえば、別のクラスを作成できますTaskTemporaryGroup
。そのクラスに ivar NSSet を与えます。これはsubtasks
、タスクで子を取得するために使用できるのと同じキー パスです。次に、一連の TaskTemporaryGroup オブジェクトをツリー コントローラーにバインドすると、トップ レベルのアイテムが下位のアイテムとは異なるクラスであるという事実に関係なく、ツリー全体が配置されます。ドラッグ アンド ドロップを実装するときは、グループ化された行を任意にドラッグできないように注意する必要がありますが、うまくいく可能性があります。
もう 1 つの論点は、テーブル ヘッダーをクリックして各グループ内の行を並べ替えたいが、トップ レベルのグループを並べ替えたくないということです。NSTreeController がソート記述子を階層の各レベルに適用すると思いますか? 残りのセルをソートできるようにしたいキーパスのいずれかに対して、TaskTemporaryGroup クラスが同じもの (つまり、個別に計算した望ましいソート順) を返すようにすることができます。どのプロパティでソートされていても、同じ順序のままであるように見えます。これは良い方法ですか、それともハックですか?
要約すると、次のようになります。
- 最上位レベルが特殊なケースで、後続のすべてのレベルが同じ種類のオブジェクトであるこの種の階層を実装することを人々はどのように提案しますか?
- 子オブジェクトと同じキー パスにたまたま応答するトップ レベル オブジェクトを表すクラスを使用して、私が説明した方法は良い方法でしょうか?
- このシナリオで並べ替えをうまく機能させる方法についてのヒントはありますか?
- それとも、このタスクにバインディングを使用しようとすると、私は大変なことになるのでしょうか?
ありがとう、
エイミー
objective-c - NSTreeControllerを使用すると、モデル配列を変更するときにNSOutlineViewを手動で再ロードする必要がありますか?
NSTreeControllerを使用してNSOutlineViewに表示したいツリーのようなモデルがあります。
NSTreeControllerの挿入関数と削除関数を使用してモデルツリーを変更する限り、バインディングを設定でき、すべてが正常に機能します。モデルツリーに直接挿入またはモデルツリーから削除しようとすると、NSOutlineViewが更新されない場合があります。
展開されたオブジェクトのグループにオブジェクトを挿入すると、次のように機能します。
しかし、以前は子がなかったノードに最初のオブジェクトを追加しようとしても、何も起こりません。開示三角形が表示されていないため、展開して新しいノードを表示することはできません。
新しいオブジェクトでそのノードにカーソルを合わせると、ノードが展開され、問題なく2番目の子を追加できます。しかし、三角形はまだ見えません:
最後に、これらすべてのノードの親を閉じて再度開くと(リロードをトリガーすると)、三角形が突然表示されます。
そのため、三角形を表示するためにNSOutlineViewの行を手動でリロードする必要があるのか、それとも何かを台無しにしているのか疑問に思いました。ありがとう!!
アップデート:
私のNodeクラスに、次のような新しい子を追加します。
そして、これらも実装しました(NSTreeController用にIBで設定しました)。
childNodes
これは(特に)あまり最適化されていないことは知っていますが、最終バージョンでは子がC配列に格納されるため、現時点では実験中です。
更新2:
他の2つのプロパティについてもKVO通知を送信しようとしましたが、それも役に立ちませんでした。
objective-c - NSTreeControllerを使用せずに、モデルが変更されたときにNSOutlineViewを自動的に更新します
NSOutlineViewをバインディングとNSTreeControllerの使用からデータソースとデリゲートの使用に変更した場合、モデルツリーが変更された場合、NSOutlineViewを自動的に更新するにはどうすればよいですか?ツリー内のすべてのノードのchildNodesプロパティをコントローラーで監視し、変更が発生したときにリロードをトリガーする必要がありますか?または別の方法はありますか?
cocoa - アウトライン ビューで特定のノードを表示しない方法は?
Apple のメール アプリでは、左側のアウトライン ビューで、受信トレイまたはフォルダーが階層で表示されますが、フォルダーまたはメール内のメールはまったく表示されません。
この機能を再現したいと思います。
ツリー コントローラに接続されたアウトライン ビューがあります。ツリー コントローラにオブジェクト (ノード) が追加され、アウトライン ビューに表示されます。一部のオブジェクトが表示されないようにするにはどうすればよいですか? 具体的には、カスタム オブジェクトのインスタンスを含むフォルダー ノードがあります。Mail.app と同じように、フォルダーをアウトライン ビューにのみ表示し、カスタム オブジェクトを別のビューに表示したいと考えています。
リクエストに応じたコントローラーコード。ここでは、アウトライン ビューで選択されている folderNode にノードを追加しています。