問題タブ [nsoutlineview]
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 - NSOutlineViewに複数の列をインデントさせる方法は?
NSOutlineViewで複数の列をインデントするための最も簡単な方法または推奨される方法は何ですか?デフォルトでは、アウトライン列のみをインデントします。私の知る限り、他の列をインデントするための組み込みのサポートはありません。
2セットの階層データ間の比較を示すNSOutlineViewがあります。視覚的にアピールするために、アウトライン列の一部のアイテムがインデントされている場合、別の列の同じ行のアイテムを同じインデント量でインデントしたいと思います。(2つの項目を比較した結果を示す3番目の列もあります。この列はインデントしないでください。)
これは、NSOutlineViewをサブクラス化することによってのみ達成できますか?そして、サブクラスで何をオーバーライドする必要がありますか?または、複数の列をインデントする簡単な方法はありますか?
objective-c - 異種の NSTreeController
私は NSTreeController (コンテンツを NSOutlineView に提供する) を持っています。トップレベルのオブジェクトを 1 つのクラスにし、他のすべてのオブジェクト (つまり、任意のレベルの子) を別のクラスにしたいと考えています。これについて最善の方法は何ですか?
少なくともadd
、addChild
、insert
、およびの動作をどうにかして変更する必要がinsertChild
あると思います。ただし、4 つの別々の方法を変更するのではなく、1 つの場所だけでこれを説明する簡単な方法を見つけたいと思っていました。
cocoa - データ ソースからデータをロードする NSOutlineView のすべての項目の展開
まず第一に、私はココア開発に慣れていないので、おそらくこれを間違った方法で行おうとしていると思いますが、次のようになります。
NSOutlineView
実装からデータをロードする がありますNSOutlineViewDataSource
。ロード後にすべてのアイテムを展開したいのですが、データのロードが完了したときに発生するイベントが見つからないように見えるので、それに送信できます[outlineView expandItem: nil expandChildren: YES]
。
プロトコルを調べましたNSOutlineViewDelegate
が、この通話に適した場所が見つかりませんでした。この問題に対する最善のアプローチは何でしょうか?
objective-c - 静的 NSOutlineView の実装
NSArray で定義された静的で決して変化しない構造を持つ NSOutlineView を実装するのに十分な知識の断片をかき集めるのに苦労しています。このリンクはすばらしいものでしたが、サブメニューを把握するのに役立っていません。私はそれらがネストされた NSArrays だと思っていますが、明確な考えはありません。
次のように定義された NSArray 内に NSArray があるとします。
テキストは、outlineView:objectValueForTableColumn:byItem: で定義されます。
結果は '1'、'(' (展開可能)、'3' です。NSLog は '(' で始まる配列を示しているため、2 番目の項目です。これを展開すると、'境界を超えている' ため、クラッシュが発生します。 parentForItem: しかし、結果を比較する対象がわかりませんでした。
私は何が欠けていますか?
objective-c - NSOutlineViewDelegate - didFinishEditing のようなものが必要
NSOutlineViewDelegate
セルをoutlineView:shouldEditTableColumn:item:
編集する前に呼び出されます。ユーザーがセルの編集を終了した後に呼び出される同様のメソッドが必要です (いくつかの計算をトリガーするため)。このイベントはどこで探すべきですか?
objective-c - NSOutlineViewに動的に入力されたNSPopUpButtonCellメニュー
私NSOutlineView
は2つの列を持つを使用しています。私dataSource
は、ファイルタイプを表すカスタムクラスのアイテムのツリーをアウトラインビューに提供します(つまり、UTIで初期化します)。最初の列は、ファイルタイプの表示名です(たとえば、「ソースコード」、「Interface BuilderNIBドキュメント」など)。2番目の列はNSPopUpButtonCell
、ユーザーが特定のドキュメントタイプのハンドラーを選択できるようにするためのものです(Xcodeの[ファイルタイプ]設定ペインを考えてみてください。ほとんどそこにいます)。
ツリー内の特定のアイテムのを生成NSMenu
し、UTIのLaunch Servicesデータベースエントリに基づいてオプションを入力し、関連するアプリケーションアイコンなどを追加することができます。実際、メニュー自体は素晴らしく機能し、を介して入力されますNSPopUpButtonCellWillPopUpNotification
。
問題は、私が思うに、メニューがポップアップされない-handlerName
ときのセルには、空の文字列、またはセルのデフォルトのテキストのいずれかが常に含まれていることです。前者は、アイテムの結果の場合(列に割り当てられた属性)は非nil
です。それ以外の場合は後者です。
さらに、私はインスタンスを手動で呼び出し-selectItem:
ていNSPopUpButtonCell
ますが、これは間違っているようです。対照的に、左側の列は単なるNSTextFieldCell
、すべてが正常に機能します(ただし、許可されている場合は、アイテムから値を読み取って表示するだけです)。
(免責事項:私はCocoa UIにかなり慣れていません。私は、Objective-Cや他の多くのプログラミング言語を知っていますが、Mac OS X UIの構築についてはあまり経験がないので、優しくしてください)。
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 がいつ読み込まれるかを観察し、項目を展開して選択を変更することは可能だと確信していますが、それはぎこちなく、回避策のように感じます。
これをエレガントにするにはどうすればよいですか?
cocoa - NSOutlineView が再描画されない
チェックボックス付きの NSOutlineView があります。チェックボックスの状態をノード項目にキー shouldBeCopied でバインドしています。ノード項目には、次のようなゲッターとセッターがあります。
ここでの考え方は、親がチェックされている場合は、子もチェックする必要があるということです。私が抱えている問題は、親をチェックすると、子が既に展開されている場合、子のビューが更新されないことです。実際に値を変更していないため、バインディングによって更新されるべきではないことを理解できます。しかし、reloadData によってバインディングが値を再取得し-shouldBeCopied
て、子を呼び出してはいけませんか? -setNeedsDisplay
andなどの他のいくつかのことを試しました-reloadItem:nil reloadChildren:YES
が、どれも機能しません。xcode にスワップしてから再び元に戻すと、ディスプレイがリフレッシュされることに気付きました。
objective-c - ヘッダーを表示せずに NSOutlineView の列のサイズを変更する
2 つの列を持つアウトライン ビューがあります。ユーザーが両方の列のサイズを変更できるようにしたいのですが、列ヘッダーも表示しないとできないようです。誰でもこれを行うことに成功しましたか?
cocoa - [NSOutlineView clickedRow] が常に -1 を返すのはなぜですか?
私はかなり歩行者の編集不可能なNSOutlineView
設定をしています。アウトライン ビューのバインディングでは、Double Click Target バインディングをファイルの所有者 ( MyDocument
FWIW) にセレクターで設定しました。outlineViewWasDoubleClicked
メソッドは存在し、呼び出されますが、呼び出す-clickedRow
と、メソッドをトリガーするためにダブルクリックした行の行番号ではなく、一貫して -1 が返されます。
私_outlineView
はIBOutletであり-selectedRow
、メソッドではなくforを使用して正しく接続されていることを確認しました-clickedRow
(-clickedRow
ユーザーが行を選択するのは直感的ではないように思われるため、別の行をダブルクリックして何かを実行します選択した行でメソッドをトリガーします。)
私の最善の推測では、-clickedRow
私のメソッドが起動する前に値がクリアされているということですが、どこで、または何がそれを飲み込んでいるのかはわかりません。
助けてくれてありがとう。