問題タブ [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 投票する
2 に答える
487 参照

objective-c - 異種の NSTreeController

私は NSTreeController (コンテンツを NSOutlineView に提供する) を持っています。トップレベルのオブジェクトを 1 つのクラスにし、他のすべてのオブジェクト (つまり、任意のレベルの子) を別のクラスにしたいと考えています。これについて最善の方法は何ですか?

少なくともaddaddChildinsert、およびの動作をどうにかして変更する必要がinsertChildあると思います。ただし、4 つの別々の方法を変更するのではなく、1 つの場所だけでこれを説明する簡単な方法を見つけたいと思っていました。

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

cocoa - 起動時に NSTreeController のデフォルトの選択を設定するにはどうすればよいですか?

背景

Cocoa アプリでソース リスト (iTunes などと同様) を作成しました。

  • Value列がNSTreeControllerのarrangedObjects.nameキーパスにバインドされたNSOutlineViewがあります。

  • NSTreeController は、コア データ ストア内の JGSourceListNode エンティティにアクセスします。

  • JGSourceListNode の 3 つのサブクラス - JGProjectNode、JGGroupNode、および JGFolderNode があります。

  • App Delegate で selectedIndexPaths と呼ばれる NSArray にバインドされた NSTreeController の selectedIndexPaths があります。

起動時にグループ ノードを検索し、コア データ ストアに見つからない場合は作成します。

私が欲しいもの

アプリを起動すると、トップ レベルのグループが両方とも展開され、「訓練されていない」が次のように強調表示されます。

マイ ウィンドウ http://synapticmishap.co.uk/Window.jpeg

問題

applicationDidFinishLaunching:アプリ デリゲートのメソッドに次のコードを追加します。

しかし、アウトライン ビューはまだ準備されていないようで、このコードは何もしません。

理想的には、最終的にユーザーが行った最後の選択を保存し、再起動時にこれを復元したいと考えています。

質問

クレイジーな KVO を使用して NSTreeController または NSOutlineView がいつ読み込まれるかを観察し、項目を展開して選択を変更することは可能だと確信していますが、それはぎこちなく、回避策のように感じます。

これをエレガントにするにはどうすればよいですか?

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

osx-snow-leopard - NSTreeControllerとNSTreeNode(ユキヒョウ)を使用したaddChildなど

NSTreeNodeで表されるオブジェクトとなるオブジェクト(OTNodeDatum)(OutlineTestの場合はOT)を使用するセットアップがあります。NSTreeNodeは、NSTreeControllerの属性ページに表示されるクラスです。

ドキュメントベースのアプリがありますが、コアデータはありません。MyDocument initで、1つのアイテムを含むNSMutableArray、単一のプロパティ(yes、name)を含む表現されたオブジェクトを持つNSTreeNodeを使用してコンテンツを設定しました。

[追加]ボタン、[子の追加]ボタン、[削除]ボタン、インターフェイスビルダーを介してNSTreeControllerの追加アクションに接続など。

それはある程度まで機能します。

追加を行うと、編集できる新しい空白行が表示されますが、セルを離れると、挿入されたテキストが消えます。

削除すると、物事が削除されます。

子を追加しても何も起こりません。

新しいツリーノードの追加に加えて、子の追加と新しい表現されたオブジェクトの追加に関して正しい動作を得るには、NSTreeNodeまたはNSTreeControllerのいずれかをサブクラス化する必要があると思います。

これは正しい方向に進んでいますか?NSTreeControllerをサブクラス化する場合、正しいことを実行するために、add、addChildをオーバーライドするだけでしょうか。そして、私は何を台無しにすることができますか?私は長い間探していましたが、これに関するガイダンスを見つけることができないようです。

ありがとう。

ジョンV

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

cocoa - オブジェクトが NSOperations から管理対象オブジェクト コンテキストに追加されたときに NSOutlineView が更新されない

バックグラウンド

  • コア データを使用する Cocoa アプリ 2 つのプロセス - デーモンとメイン UI
  • デーモンが常にデータ ストアに書き込みを行っている
  • UI プロセスが同じデータ ストアから読み取る
  • NSTreeController にバインドされた UI の NSOutlineView の列
  • NSTreeControllers managedObjectContext は、delegate.interpretedMOC のキー パスを持つアプリケーションにバインドされます。
  • NSTreeControllers エンティティは TrainingGroup に設定されます (NSManagedObject サブクラスは JGTrainingGroup と呼ばれます)

私が欲しいもの

UI がアクティブになると、デーモンによって挿入された最新のデータでアウトライン ビューが更新されます。

問題

メインスレッドアプローチ

関心のあるすべてのエンティティをフェッチし、refreshObject:mergeChanges:YES を実行してそれらを反復処理します。これは問題なく動作します - アイテムは正しく更新されます。ただし、これはすべてメイン スレッドで実行されるため、更新中に UI が 10 ~ 20 秒間ロックされます。では、これらの更新をバックグラウンドで実行される NSOperations に移動しましょう。

NSOperation マルチスレッド アプローチ

refreshObject:mergeChanges: 呼び出しを NSOperation に移動するとすぐに、更新が機能しなくなります。ログ メッセージを追加すると、新しいオブジェクトが NSOperation サブクラスによって読み込まれ、更新されることは明らかです。私が何をしても、 NSOutlineView が更新されないようです。

私が試したこと

私はこれを2日間しっかりといじり、考えられるすべてを試しました。

  • エンティティ名の代わりにオブジェクト ID を NSOperation に渡して更新します。
  • データの更新後、アウトライン ビューの再読み込み前など、さまざまな時点で解釈された MOC をリセットします。
  • NSOutlineView をサブクラス化しました。ここでおかしなことが起こった場合に備えて、サブクラスを破棄し、ビューを NSOutlineView のインスタンスに戻しました。
  • NSOutlineView データをリロードする前に、rearrangeObjects 呼び出しを NSTreeController に追加しました。
  • 使用していたすべての管理対象オブジェクト コンテキストで、失効間隔を 0 に設定したことを確認しました。

この問題は、メモリ内のコア データ オブジェクトのキャッシュに何らかの形で関連していると感じています。しかし、これを機能させる方法についてのアイデアはすべて使い果たしました。

なぜこれが機能しないのかについて光を当てることができる人には、永遠に感謝します.

コード

メインスレッドアプローチ

NSOperation マルチスレッド アプローチ

更新 1

この質問を見つけました。私が投稿する前にどうしてそれを見逃したのか理解できませんが、要約すると、コアデータは私がしていることを行うように設計されていません. 1 つのプロセスのみがデータ ストアを使用する必要があります。

NSManagedObjectContext および NSArrayController のリセット/リフレッシュの問題

ただし、アプリケーションの別の領域では、データ ストアを共有する 2 つのプロセスがあり、1 つのプロセスが読み取り専用アクセスを持っていますが、これは正常に機能しているように見えました。さらに、このトピックに関する私の最後の質問に対する回答のどれも、これが Core Data でサポートされていないことを述べていませんでした。

一度に 1 つのプロセスだけがデータ ストアに書き込むように、アプリを再構築します。しかし、これが私の問題を解決するかどうかはまだ懐疑的です。私には NSOutlineView の更新の問題のように見えます-オブジェクトはコンテキストで作成され、アウトラインビューがそれらを拾わないだけです。

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

objective-c - 重複するエンティティを表示するNSTreeControllerの提案されたソリューション

多くの人が知っているかもしれませんが、アウトラインビューにバインドされたNSTreeControllerは、コアデータエンティティを表示しているときに重複を表示できます。

一時的な解決策は、述語に'parent == nil'を追加することですが、これは親エンティティのみを返します。たとえば、ユーザーがサブエンティティを検索している場合、要求されたサブエンティティは表示されません。

(提案された)解決策は、NSTreeControllerをサブクラス化し、現在表示されているエンティティを追跡するNSMutableSet変数を追加することです。この変数は、initで割り当て、deallocで解放する必要があります。

「fetchWithRequest:merge:error:」が呼び出されたら、セットを空にする必要があります(これを解放して再度割り当てるよりも効率的かどうかはわかりません)。エンティティが表示に追加されるたびに、セットにエンティティが含まれているかどうかを確認してください。そうでない場合は、追加します。それ以外の場合は、ルートに近い方(サブエンティティ)を見つけて、そのサブエンティティの場合はスキップするか、以前に含まれていたものと交換します。

パフォーマンスへの影響は比較的少ないはずだと思います(NSSetがハッシュを使用していることを考慮して)。私が抱えている問題は、この動作を追加するためにオーバーライドする正しいメソッドを見つけることです。具体的には、「fetchWithRequest:merge:error:」が呼び出された後、NSTreeControllerがフェッチされたエンティティを処理します。

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

objective-c - NSTreeControllerselectionIndexPathsにバインドします

次のようにして、NSTreeControllerのselectionIndexPathsにプログラムでバインドしたい(文字列を選択してテキストビューに表示できるようにするため)

[activePDFView bind:@ "name" toObject:treeController withKeyPath:@ "selectionIndexPaths.nodeName" options:options];

ツリーコントローラーは、「nodeName」プロパティを持つオブジェクトを含むNSMutableArrayにバインドされています。NSMutableArray内のオブジェクトは、適切なアクセサーを実装したため、プロパティ「nodeName」に対してKVCに準拠しています。

コンパイルすると、次のメッセージが表示されます

'[<__ NSArray0 0x1001698d0> addObserver:forKeyPath:options:context:]はサポートされていません。キーパス:nodeName '

よくわかりませんが、バインディングは正しいですか?

ありがとう。

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

objective-c - プログラムでコア データ エンティティから NSOutlineView に項目を配置しますか?

これがばかげた質問のように思われる場合は申し訳ありません-私はObjective-CとCocoaに関してはアマチュアであり、コアデータの使用に関してはさらに知識がありません.

状況は次のとおりです。NSTreeController を使用して手動でいくつかの項目を既に入力した NSOutlineView があります。ここで行う必要があるのは、Core Data エンティティの 1 つでアイテムを取得し、それらを NSOutlineView の現在のコンテンツに追加することです。

明らかにこれはバインディングの能力を超えているため、プログラムで行う必要があります。私は何をすべきか?フェッチを実行してから、返されたアイテムを反復処理し、それぞれをアウトライン ビューに追加する必要があると想定しています。これは正しいです?もしそうなら、誰かがこれがどのように行われるかの例を示すことができますか?

ありがとう!

0 投票する
3 に答える
1315 参照

cocoa - 一時的な isRoot 例外に基づく NSTreeController フェッチ述語

私のドキュメント ベースの Cocoa アプリケーションは、ドキュメントのコア データ ストアにバインドされた NSOutlineView/NSTreeController コンボを使用します。私の NSTreeController には fetch predicate がありisRoot == YESます。 isRootは一時的なブール属性で、デフォルト値はNOです。私のルートモデルのawakeFromInsert呼び出し:

[self setIsRoot:[NSNumber numberWithBool:YES]];

オブジェクトを階層に追加することはできますが、保存したばかりのドキュメントを読み込もうとすると、例外が発生します。

[<NSDictionaryMapNode 0x1001a8190> valueForUndefinedKey:]: this class is not key value coding-compliant for the key isRoot.

xcdatamodel で属性を non-transientに変更すれば、この例外を回避し、新しく保存したドキュメントを正常に読み込むことができますisRootが、transient フラグに関する私の理解に基づいて問題が発生することはなく、これは実際には問題ではありません。永続化する必要があるデータの種類。

また、適切な固定値を返すように NSManagedObject サブクラスに実装しようと-isRootしただけでなく、 内で同じsetIsRoot:呼び出しを行ってみましたが、どちらも役に立ちawakeFromFetchませんでした。

私が見逃している他の微妙な点はありますか?フェッチ述語が一時属性をサポートしていないとは思えません。isRootCore Data の内部動作についてはよくわかりませんが、私の NSManagedObject サブクラスではなく、ストア固有のクラスを検索しようとしているのは興味深いようです。

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

objective-c - NSTreeController/NSOutlineViewを使用して子オブジェクトを追加する

私のアプリケーションには、多くのMacアプリケーションと同様に、ソースリストがあります。現時点では、これはNSTreeControllerにバインドされたNSOutlineViewです。非常に簡単にアイテムを追加でき、灰色のすべて大文字のヘッダーなどを使用して、「ソースリスト」の外観を複製することもできます。しかし、私を回避する何かがあり、それは私をばかげている。

ツリー内の特定のアイテムに子を追加するにはどうすればよいですか?たとえば、「チーズ」というタイトルのアイテムを作成したとします。「チェダー」と「スイス」という2人の子供をチーズに追加しました。最初の追加メソッドの実行が終了したので、子のリストに「LonghornColby」を追加するにはどうすればよいですか。

私はそれをグーグルで検索しましたが、単純で直接的な答えを見つけることができません。しかし、私が見ることができることから、それは不必要に複雑であり、朝食を食べるのと同じくらい簡単なことをするために議会の行為を要求することに似ています。私が間違っている場合は訂正してください。

アップデート:

サブタイプを使用しているとは思わない。これまで、これまで私がツリーにデータを入力してきた方法は次のとおりです。

「isSourceGroup」ビットは、このアイテムがアウトラインビューのヘッダーの1つであることを示すために使用されます。

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

cocoa - NSOutlineViewとNSTreeControllerは何千ものオブジェクトを処理できますか?

バックグラウンド

  • GCを使用したSnowLeopard10.6.4のCoreDataアプリ

  • バインディングを使用してNSTreeControllerに裏打ちされたNSOutlineViewがあります

  • 私はバックグラウンドのNSOperationサブクラスに数十のオブジェクトを作成し、保存mergeChangesFromContextDidSaveNotificationしてメインコンテキストにマージするために使用しています。これらはすべて、Appleドキュメントで推奨されています。

  • メインコンテキストには何千ものオブジェクトがあります

問題

パフォーマンスの問題がたくさんありました。マージに数秒かかることがあり、UIがロックされます。また、かなり多くのメモリを使用しているようです。

私は最近、他の人もこの問題を抱えていることを発見しました。これは、バインディングとのNSTreeController/NSOutlineViewの組み合わせの制限であると私は考え始めています。

質問

  1. NSOutlineViewとNSTreeControllerは何千ものオブジェクトを効率的に処理できますか?

  2. この投稿は、これがrdar://7139579を引用する10.6.2の問題であることを示唆しているように見えました。これが「修正」されたかどうか誰かが知っていますか?

何か提案をいただければ幸いです。