問題タブ [key-value-observing]
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 - Cocoa での KVO/Bindings 準拠のブリッジ パターンの実装
ブリッジオブジェクトが任意の他の NSObject インスタンスの kvo/bindings 準拠のドロップインとして機能する単純なオブジェクトブリッジをココアに実装しようとしています。
ここに私の問題があります(以下のコードの詳細):
ブリッジ オブジェクトは、name という名前の NSString* プロパティとAddress* プロパティaddressを使用して、Person-Object のドロップインとして機能します。Bridge の keyPath の「名前」または「アドレス」へのバインドはうまく機能します。ブリッジの keyPath "address.street" に何らかのオブジェクトをバインドし、新しい Address-Object が Person のaddressプロパティに設定されると、問題が発生します。その結果、次のような KVO 関連の例外が発生します。
Cannot remove an observer <NSKeyValueObservance 0x126b00> for the key path "street" from <Address 0x12f1d0> because it is not registered as an observer
これは、ブリッジが「address」プロパティの変更を認識し、willChangeValueForKeyPath/didChangeValueForKeyPath タプルを発行した場合でも発生します。
以下のコードは問題を引き起こします。ファイル「BridgeDemo.m」に保存し、コンパイルして実行できる自己完結型の目的の C コードです。
この問題の解決策を知っているか、同じ問題を解決するためのより良いアプローチを提供してくれるなら、私はとても幸せなプログラマーになります!
BridgeDemo.m:
cocoa - 共有ユーティリティウィンドウと最前面のドキュメントウィンドウからバインドするための良い方法は何ですか?
複数のNSDocumentを開くことができるアプリケーションがあります。このアプリケーションには、最前面のドキュメントに適用したいいくつかの機能を含む単一のユーティリティウィンドウがあります。
ここではバインディングを使用しようとしているので、ユーティリティウィンドウのユーザーインターフェイスを最前面のドキュメントにクリーンにバインドする方法がコツです。目標は、最前面のドキュメントウィンドウを切り替えると、ユーティリティウィンドウのビューが更新されることです。最前面のドキュメントのモデルのプロパティにバインドされているコントロールは、ドキュメントのモデルなどで状態が変化したときに適切に更新されます。
このようなウィンドウからアクションを送信する場合は、ファーストレスポンダーを使用するだけで簡単です。ドキュメントオブジェクトは、レスポンダーチェーンを介してアクションをインターセプトできます。しかし、私はこれ以上のものが欲しいです、そしてもちろんあなたはファーストレスポンダーに拘束することはできません。
私が持っているいくつかのアイデア:
- 共有ウィンドウのペン先にオブジェクトコントローラーを配置します。ドキュメントウィンドウの最前面のステータスが変更されたら、そのバインディングの内容を変更します。これの欠点は、別の種類のユーティリティウィンドウがある場合、ドキュメントウィンドウからそのユーティリティウィンドウへのバインディングも忘れずに接続する必要があることです。
- ウィンドウリストをトラバースして、最前面のドキュメントウィンドウを取得するアクセサをアプリケーションデリゲートに作成します。私のユーティリティウィンドウは、アプリケーションデリゲートのメソッドを介してバインドするだけです。ここでの欠点は、KVOに準拠していないことです
- アプリケーションデリゲートにゲッターとセッターを配置して、最前面のドキュメントを決定します(おそらく、KVOに準拠するように設定しますか?それは理にかなっていますか?)。おそらく、ウィンドウ通知を使用して、ウィンドウがメインステータスを失ったときにivarを適切な値に設定します。更新:私は今のところこれを使用しています、そしてそれは実際にはかなりきれいに見えます。ドキュメントウィンドウのwindowDidBecomeMain通知から値を設定し、windowWillCloseでそれをクリアします(現在の値の場合)。大きな異議がない限り、これはおそらく私が使用するアプローチです。
- 1つのアイデアは、mainWindow.windowController.documentにバインドすることでした...これは、共有ウィンドウがメインになると、このバインドがなくなることを除いて、近くなります。したがって、実際には、最前面のドキュメントウィンドウのコントローラー(および適切なクラス)を見つける必要があります。
これらのどれも完全に正しいようには見えません。私が見逃しているこれを行うためのより良い方法はありますか?
cocoa - KVO を使用してプロキシ オブジェクトの以前/現在の値にアクセスすることは可能ですか?
私は NSArrayController を持っており、KVO を使用してその選択方法の古い/新しい値を観察しています。
これは完全に機能します (通常、選択が変更されたときにトリガーされます)。ただし、変更辞書内の項目は、古い/新しい選択されたオブジェクトではなく、すべて null です。[arrayController selection] は引き続き適切なオブジェクトを返しますが、可能であれば以前に選択したオブジェクトにもアクセスできるようにしたいと考えています (私の回避策は、代わりに選択したインデックスを観察し、それが機能するかどうかを確認することです)。
私が思いついた唯一の理由は、おそらく NSArrayController がプロキシ オブジェクトであるためです。
これは予想される動作ですか、それとも何かおかしなことが起こっているのでしょうか?
編集:インデックスだけを観察しようとしましたが、それもうまくいきませんでした。古いキーと新しいキーの両方が引き続き null として表示されます。
cocoa - 挿入/削除のために NSMutableArray を観察する
クラスには、( 経由で) 合成されたアクセサーを持つ NSMutableArray 型のプロパティ (およびインスタンス var) があります@property
。以下を使用してこの配列を観察する場合:
そして、次のように配列にオブジェクトを挿入します。
observeValueForKeyPath... 通知は送信されません。ただし、以下は適切な通知を送信します。
これは、mutableArrayValueForKey
オブザーバーへの通知を処理するプロキシ オブジェクトを返すためです。
しかし、合成されたアクセサーは、そのようなプロキシ オブジェクトを自動的に返すべきではありませんか? これを回避する適切な方法は何ですか? を呼び出すだけのカスタム アクセサーを作成する必要があります[super mutableArrayValueForKey...]
か?
objective-c - setNeedsDisplay が機能していませんか?
単純なココア アプリケーションでカスタム ビューを再描画する際に問題があります。描画は、単純な NSSlider によって変更される 1 つのパラメーターに基づいています。ただし、-setParameter: および -parameter メソッドを実装し、インターフェイス ビルダーでスライダーの値をそのパラメーターにバインドしますが、それ自体を再描画するカスタム ビューを作成できないようです。
再描画を行うコードは次のようになります。
ビュー自体は再描画されませんが、新しいパラメーターの設定に関するメッセージが表示されます。どんなアイデアでも大歓迎です!
cocoa - ココアで大文字と小文字を区別しない KVC?
私が使用しようと考えている特定のアプローチに関するフィードバックをいただければ幸いです。シナリオは以下。
x 座標と y 座標、高さ、幅など、多数のプロパティを持つオブジェクト (MObject と呼びましょう) があります。プロパティは、KVC ガイドライン (MObject.x、MObject.height など) に従って名前が付けられます。次のタスクは、この MObject を記述した XML ファイルを読み込むことです。残念ながら、XML 要素の名前は、X と Y、高さと幅 (大文字に注意してください) とは異なります。
XML 要素が MObject のプロパティと一致することが理想的です。この場合、KVC を使用して、コード全体を回避できます。
これにアプローチする 1 つの方法は、大文字と小文字を区別しないキーを使用することです。どこから始めますか?他のより良い解決策はありますか?
提案は大歓迎です。
objective-c - NSBrowser で選択したセルのパスを使用して NSPathControl を更新し続けるにはどうすればよいですか
NSBrowser で現在選択されているパスを使用して NSPathControl を更新し続ける必要がありますが、パスが NSBrowser から変更されたときに通知を受け取る方法がわかりません。これを行う理想的な方法は、NSBrowser でパス キー パスを観察することですが、これにより、KVO は<key>
void メッセージを返し、更新を行わない set メソッドのみを観察できます (setPath は bool 成功値を返します)。
selectedCell キーパスも観察しようとしましたが、選択が変更されたときに通知が届きません。
私が見逃しているこれを行うための他の本当に明白な方法はありますか?
iphone - キー値コーディング
単純な iPhone アプリケーションを開始したとき、XML の抜粋のキーと値のペアを NSDictionary に変換する単純なアプローチがありました。問題は、動作と追加の複雑さが必要になるため、UITableView に一度入力した NSDictionary のインスタンスをカスタム クラスに変換する必要があることです。ここでの問題は、オブジェクトをインスタンス化し、そのインスタンス変数に Web サービスからのキーと値のペアを入力するのが非常に難しくなっていることです。XML を反復処理し、KVC を使用してそのインスタンス変数を設定するメソッドにそれをスローすることはできなくなりました。
他にどのような解決策がありますか?
objective-c - Key-Value コーディングとそのスクリプト機能
インスタンス変数を単純化するオブジェクトがあります。一部は NSString で、一部は unsigned int などです。次のようなコードを記述できるという点で、Key-Value コーディングはスクリプト可能であるという印象を受けました。
ここで stringValue と name を使用している理由は、TouchXML を使用して XML フィードからオブジェクトを構築しているためです。
整数に何かを割り当てようとすると、上記のコードがクラッシュします。unsigned int を NSString のインスタンスに変更すると、ランタイム クラッシュは発生しません。Key-Value コーディングは、これらの問題を検出するのに十分スマートであると理解していました。
私の可能な解決策は何ですか?独自のインスタンス変数を持つ多くの異なるクラスで同じメソッドを実行できるように、これを可能な限り抽象化するにはどうすればよいですか?
セッターを実際にオーバーライドし、NSNumber を使用して文字列を int 型に変換する最もエレガントな方法は、KVC によって既に処理されていると思われますか?