問題タブ [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.
xcode - Interface Builder で NSTreeController を構成する方法
Interface Builder (Xcode 4.6.3) でを選択NSTreeController
し、属性インスペクターを見ると、Tree Controller と Object Controller という名前の 2 つのセクションが表示されます。Tree Controller の部分はある程度理解できますが、Object Controller セクションの説明を見つけるのに苦労しています。最初の項目は「モード」で、オプションは「クラス」と「エンティティ名」ですが、コアデータを使用する場合は後者、使用しない場合は前者を使用すると思います。私はコアデータを使用していません。では、次の項目であるクラス名の意味は何ですか? デフォルトはNSMutableDictionary
ですが、標準のツリー ノード タイプは だと思いましたNSTreeNode
。NSTreeNode
具体的には、表現されるオブジェクトが であるツリー ノードを にしたい場合NSMutableDictionary
、オブジェクト コントローラ セクションにどのように入力すればよいでしょうか?
回答後の補足: type のノードを使用してアウトライン ビューのコンテンツ ツリーを構築できることがわかりNSMutableDictionary
ましたが、 のサブクラスを作成することには利点がありNSTreeNode
ます。まず、NSTreeNode
親リンクを自動的に追跡します。これは場合によっては便利です。次に、データ メンバーをプロパティとして定義し、メッセージではなくドット表記を使用してそれらにアクセスできobjectForKey:
ます。
cocoa - コンテンツの更新時に NSOutlineView がトップにジャンプする
NSOutlineView
ディレクトリ階層を表示している があります。これNSTreeController
は、ファイル システム ノードを管理するクラスにバインドされています。ファイルシステム イベントが発生すると、キーパスで KVO 通知を起動しchildren
ます。これにより、アウトライン ビューが更新されます。しかし、更新すると、突然一番上までスクロールします。スクロール位置を同じに保ちたい。何か案は?
FS イベントが発生したときに実行されるコードは次のとおりです。
これはモデル内にあるため、ビューにアクセスできません。
objective-c - ツリーの KVC アクセサー パターン
このドキュメントでは、Apple は、To-One および To-Many プロパティのアクセサ パターンについて説明しています。To-Many プロパティは、インデックス付きコレクションと順序付けされていないコレクションをカバーします。
これは私に質問をもたらします:
ツリー構造には異なるアクセサーパターンがありますか?それとも他のタイプのコレクションと同じように使用 (または適応) する必要がありますか?
どうやら、モデルに Indexed To-Many アクセサーを実装してブレークポイントを設定してもNSArray
、ツリー構造の保持がNSTreeController
. 要素の追加/削除、順序の変更など、モデルは正しく更新されますが、アクセサーの実装は呼び出されません。
ここで何か不足していますか?
objective-c - NSTreeController: ノードの親を見つけるにはどうすればよいですか?
同様の方法を探しています: NSOutlineView
parentForItem:
NSTreeController 用。
ツリー内のノードの親を知る必要があります。
cocoa - NSOutlineView または NSTreeController からの表示から NSElements を削除します
NSXMLDocument によって駆動される NSTreeController にバインドされた NSOutlineView で、(同じタイプの) 一部の NSElements のみを表示し、他のものは表示しないようにするにはどうすればよいですか?
ありがとう
objective-c - NSTreeController と NSOutlineView を動的に更新する方法は?
OutlineViewItem が展開されている場合 -
- オブジェクトを TreeController に正常に追加できます (ログ ステートメントは、階層の正しい場所に新しく追加されたオブジェクトを示します) が、OutlineView/UI はその挿入を反映するように更新されません。
無駄に、私は使用しました
[self.outlineView reloadItem:nil reloadChildren:YES]
、[self.outlineView reloadData]
、さらには[self.outlineView setHidden:YES]
それから
[self.outlineView setHidden:NO]
構造を強制的にリロードしようとします。
これはすべて、Objective-C でプログラムによって行われます。
cocoa - NSTreeController - 選択したノードの取得
bookController (NSCreeController) に Book オブジェクトを追加しました。行を選択したときに、保存された Book オブジェクトを取得したいと思います。
objective-c - NSTreeController: カスタム プロパティ キーパスの KVO が失敗します。
セットアップ
私はNSTreeController
サブクラスを持っています。selectedProject
カスタムであり、ヘッダーで次のように宣言されているというプロパティがあります。
プライベート実装では次のようになります。
重要なのは、TreeController で変更するすべてのポイントでselectedProject
、生成されたセッター/ゲッターを通過することです。iVar を直接変更することはありません。
基本的に、このプロパティが存在する理由は、通常のプロパティselectedObjects
とselection
プロパティNSTreeController
が型指定されていないためです。この TreeController は常に LPProject オブジェクトのみを管理し、一度に選択できるプロジェクトは 1 つだけであることがわかっているため、クリーンな iVar が必要でした。 selectedObjects を常に取得するのではなく、存在するかどうかを確認し、配列内の最初のオブジェクトを取得するなどの方法を使用します。
LPプロジェクト
LPProject
Core DataのカスタムNSManagedObject
サブクラスです。という名前のプロパティがありますenabled
。このプロパティは、NSNumber で表される BOOL です。そのためのゲッター/セッターは Xcode によって生成されます。
問題
いくつかのコントローラーで、次のようにオブジェクトのenabled
プロパティを監視しようとします。selectedProject
selectedProject
KVO 通知が変更 (およびその結果の変更)時に届くことを確認しましたselectedProject.enabled
。ただし、プロパティのみが変更された場合(つまり、選択したプロジェクト自体が変更されていない場合)、KVO 通知は届きません。enabled
selectedProject
ただし、代わりにこの方法で購読する場合:
それは完全に機能します。enabled
変化して変わらない場合selectedProject
、KVO 通知が届きます。
KVOに準拠していて、キーパスが機能するはずだselectedProject
と思うので、私はこれに混乱しています。.enabled
誰でもこれに光を当てることができますか?私は何を逃したのですか?