問題タブ [cocoa-bindings]

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 投票する
1 に答える
520 参照

cocoa - Cocoa コア データの自己参照インターフェース ビルダーに関する質問

インターフェイスビルダーで以下を機能させる方法を理解するのに苦労しています。

いくつかの属性 (名、姓など) と他の人 (友人) との関係を持つ Core Data モデル クラス "Person" を作成しました。

概念的には、これは非常に単純です。ただし、これを IB で機能させる方法を理解するのは難しいことがわかっています。

ウィンドウの左側にすべての人を一覧表示するテーブルがあるインターフェイスを作成しました。右側には、人物の詳細を入力するためのフィールドがあります。

右側に「友達」と追加および削除ボタンを表示する小さなテーブルが必要です。追加ボタンをクリックすると、リストをフィルタリングするための検索機能を備えた小さなパネルが起動し、「友達」セットに追加する人を 1 人選択できます。

誰かが私にいくつかの提案をしたり、このようなことをすることがわかる例を教えてもらえますか?

前もってありがとう、マット

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

objective-c - NSTableView、複数のセルとバインディング

Motion のプロパティ ビューに似たビューを作成しようとしています。

スクリーンショット

各プロパティ オブジェクトには、表示するセルの種類の定義が含まれています。しかし同時に、バインディングを使用して、値が他の場所で変更できるように自動的に更新されるようにしたいと考えています。

私は問題に対していくつかの異なるアプローチを試みました。

  • 複数のセルdataCellForTableColumn:。これにより、すべてのセル タイプに対してレンダリングが適切に行われますが、バインディングが失われます。

  • NSProxy: すべてのメソッドをその背後にある選択したセル タイプに転送すると思われるプロキシ オブジェクトを使用してみましたが、ここでもバインディングが機能しないようです。

以前にこの種の問題を経験した人はいますか? それとも、これはバインディングがうまくいかないケースの 1 つで、自分で重いものを持ち上げる必要がありますか?

乾杯!

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

objective-c - ターゲットオブジェクトのインスタンスを同じタイプの別のインスタンスに置き換えた後、Cocoaバインディングを機能させ続けるにはどうすればよいですか?

バインディングを使用して、動的にロードされたオブジェクトとGUIを同期させたいのですが、問題のオブジェクトを同じタイプの別のオブジェクトに置き換えるとすぐに、バインディングが壊れてGUIの更新が停止します。私が何を意味するのかを理解するのに役立つコードを次に示します。

私のインターフェースには、問題のオブジェクトを保持するためのインスタンス変数があります。

次に、私の実装では、オブジェクトをインスタンス化します。

Interface Builderには、「anObject.textValue」にバインドされたテキストフィールドの「値」があります。

このメソッドを呼び出すと:

次に、テキストフィールドが更新され、新しい値が反映されます。

しかし、私がやりたいのは、アプリケーションの他の場所でいくつかの作業を行った後に与えられたオブジェクトからの値を表示することです。だから私がしたことはこれでした:

この操作の結果は、GUIからCustomObjectインスタンス(anObject)へのバインディングを壊しているように見えます。これは、バインドされたオブジェクトが別のインスタンスに置き換えられたことを考えると論理的です。

私が知りたいのは、動的に作成されたCustomObjectのインスタンスでバインディングを機能させ続ける方法があるかどうかです。プログラムですべてのコントロールを再バインドするbind:toObject:forKeyPath:options:必要はなく、(私の知る限り)IBOutletsを使用して取得する必要があります。コントロールを保持して、新しいオブジェクトの値にバインドできるようにします(IMOを使用すると、このバインドは私の状況では役に立たなくなります)。これが唯一の解決策ですか、それともこれに対処するためのより良い、よりクリーンな方法がありますか?

バインディングに関してdevelopper.apple.comや他の場所でたくさんのドキュメントを読みましたが、この特定のケースについて話しているように見えるものは何も見つかりませんでした。

よろしくお願いします!

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

objective-c - nil minValueを使用してNSSliderをNSTextFieldにバインドしますか?

スライダーで指定された値を表示するために、NSSliderをテキストフィールドにバインドしています。すべてが機能しますが、NSSliderが「nil」をminValueとしてオブジェクトに送信するようにします。

たとえば、(プロパティリストに)保存するときにnilに変換できます。

ただし、アプリの実行時に同じ動作を適用したいので、「myObj」の値がnilの場合にのみ、他のいくつかのフィールドが有効になります(バインディングあり)。問題は、NSSliderが常に「0」を返し、minValue=nilがNSSliderによって受け入れられないことです。

よろしくお願いします、ロナン。

0 投票する
4 に答える
2274 参照

objective-c - Key-Valueの監視を支援する

KVOについて少し助けが必要です、私はそこの半分くらいです。私がやろうとしているのは、TreeControllerの何かが変更されたときにメソッドをトリガーすることです。

したがって、私はこのコードを使用してKVOとして登録しています。

しかし、観察しているキーパスが変更されたときにメソッドをトリガーするにはどうすればよいですか?

もう1つの質問ですが、自分自身をオブザーバーとして追加するときに、キーパスをコアデータモデルのプロパティにしたいのですが、正しく実行しましたか?

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

cocoa - NSViewController のpresentedObjectへのバインド

(要約: バインディングはコードでは機能しますが、IB では機能しません)

NSWindowController によって管理されるウィンドウがあります。ウィンドウの左側にはソース ビューがあります。右側には、現在選択されているソースの要素を示すテーブル ビューがあります。

ウィンドウ XIB 内に NSTreeController をセットアップしました。その内容をソースビューに使用したい。それを選択すると、テーブル ビューが駆動されます。

NSViewControllers を使用してこれを分割しようとしています。1 つのビュー コントローラーは、ソース ビューを含む NIB を読み込みます。別のView ControllerがTable Viewをロードします。

ソース ビュー コントローラー内の NSTreeController にアクセスする必要があることを確認したので、それをビュー コントローラーのpresentedObjectに設定しました。(実際には、ビュー コントローラーで awakeFromNib が呼び出されるまでにこの設定を行うために、presentedObject を IBOutlet に変更しました)。

コードでソース ビューを配線すると、すべて正常に動作します。

ただし、Interface Builder を使用してこれを再現することはできません。ここでは、「コントローラーキー」テキストフィールドがグレー表示されています。したがって、「representedObject.arrangedObjects.title」のモデル keyPath を使用して、列の「値」をファイル所有者にバインドします。これは、望ましい動作を示しません。実際には例外がスローされます。-[NSProxy doesNotRecognizeSelector:_mutatingNodes] called!

IB でpresentedObject を使用するにはどうすればよいですか? IB で、presentedObject のプロキシとして機能するコントローラーを作成できますか? ソース ビュー XIB にツリー コントローラーを設定できますか? NIB の読み込み中に、presentedObject にスワップ アウトされますか?

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

cocoa - Cocoa バインディング (ファイル所有者とアプリ デリゲート)

Cocoa Bindings を使い始めたばかりで、最初のアプリケーションに取り組んでいます。

多くのサンプルや書籍では を使用していますNSArrayControllerが、単一のオブジェクトとそのプロパティをいくつかのテキスト フィールドにバインドしたいだけなので、 を使用しましたNSObjectController。また、ドキュメントベースのアプリケーションも持っていません。私のアプリケーションは単純な 1 ウィンドウ アプリケーションです。

NSObjectControllerすべてのサンプルが行ったように、ファイル所有者にバインドしようとすると、問題が発生し始めます。これを行うと、アプリケーションをコンパイルできません。「このクラスはキー値に準拠していません」というエラーが常に表示されます。
しかしNSObjectController、アプリケーションの AppController インスタンスにバインドすると、完全に正常に動作します。Textfield を のフィールドにバインドすることもできましたNSObjectController。これも正常に機能します。

しかし、正しいことをしているかどうかはわかりません。私が見つけたすべてのサンプルは、ファイルの所有者にバインドされています。これは、私のアプリでは機能しませんでした。Application Controller へのバインドは、非ドキュメント ベースのアプリケーションに最適な方法のようです。

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

cocoa - NSPopUpButtonsを含むテーブル列のバインド

1列がNSPopUpButtonCellを使用するテーブルがあります。頑張ってみてください。思い通りにすべてを適切にバインドする方法がわからないようです。これが私がやろうとしていることです:

「フィールド値」と呼ばれる管理対象オブジェクトコンテキストからアイテムを取得するNSArrayControllerがあります。これは、各アイテムのポップアップメニュー(つまり、使用可能な選択肢のリスト)を設定するために使用されます。IBでセルを選択し、そのコンテンツ/オブジェクト/値を必要に応じて「フィールド値」.arrangedObjectsおよび「フィールド値」.arrangedObjects.nameにバインドすることでこれをバインドできます(表示されるオブジェクトと表示されるタイトルを取得するため)。

次に、各行で選択された値がコントローラークラスの配列から取得され、別のNSArrayControllerを介してのみ表示されるように(そして編集されるだけで)、列をバインドします。

これまでのところ、すべてのポップアップメニューに使用可能なフィールドのリストが含まれ、各フィールドでデフォルト値が選択されるように設定することができました。ただし、実際にアイテムを選択しても効果はありません。初期値にスナップバックするだけです。また、メニューに選択した値が入力されている、使用可能なすべての値の名前が含まれている、選択内容-descriptionに追加した「none」値が含まれているなど、これに関する他のバリエーションも見つけることができました。

かなり単純なものが欠けていることは確かですが、それが何であるかはわかりません。おそらく、この種のデータをバインドする方法(つまり、コンテンツとコンテンツオブジェクトとコンテンツ値)に見落としている微妙な点がいくつかありますが、今それを見ることができれば、私は気が滅入るでしょう。

よろしくお願いします:o)

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

cocoa - Xcode ドキュメント アプリ: MyDocument の init メソッドが 2 回呼び出されるのはなぜですか?

Hillegass の第 8 章に従って、RaiseMan アプリケーションを実装しました。次に、同じプロセスに従って、受講している Cocoa プログラミング クラスの演習用のコードを実装することにしましたが、ビルドして実行した後、次の非常に不可解なエラー メッセージが表示されました。

クラス _NSControllerObjectProxy のオブジェクト <_NSControllerObjectProxy: 0x100460e30> から BOOL を作成できません

このエラー メッセージの意味がわかりません。Google で検索するといくつかヒットしましたが、それらの対策は、私がすでに行っていたことを実行することであると思われました。

Interface Builder で行ったすべての接続と割り当てをじっと見つめましたが、明らかに間違っているようには見えません。

そこで、デバッガーに入り、MyDocument クラスの init メソッド内にブレークポイントを設定しましたが、2 回呼び出されています。どうしてそれが起こり得ますか?init メソッドが 2 回呼び出されるようにするには、何を探す必要がありますか? スタック トレースは、init が自分で作成したのではないシステム関数によって呼び出されることを示しています。

比較のために、Hillegass の第 8 章に続くプロジェクトに戻り、MyDocument クラスの init メソッド内にブレークポイントを設定しました。これは 1 回呼び出されています (これは予想されることです)。