問題タブ [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.
objective-c - プログラムでバインドされた NSMutableArray にオブジェクトを追加する方法は?
次の構造を持つ NSDocument があります。
MyDocument.xib で NSArrayController と MyView をインスタンス化し、ファイルの所有者 (MyDocument) への接続を確立したので、Interface Builder の観点から、すべてが正しく行われたと確信しています。
MyView のインターフェースはシンプルです。
今、MyDocument windowControllerDidLoadNib
私は次のコードを持っています:
デバッガーで、それmyViewArray
が NSControllerArrayProxy であることを確認したので、プログラムによるバインドが正しいように見えます。ただし、 MyView のメソッドのオブジェクトを MyView に追加しようとすると、 MyDocumentmyViewArray
のmyArray
. 次の両方のアプローチを試しました。
(2 番目のアプローチでは、予想どおりコンパイラ エラーが発生しますが、KVO に関する私の限られた理解により、Objective-C ランタイムはこのメソッドを「実装」すると考えていました。)
更新しようとしている方法に何か問題がありますmyViewArray
か? プログラムによるバインドに何か問題がありますか? (MyView はカスタム ビューであり、IB パレットを作成したくないため、プログラムでこれを実行しようとしています。)
objective-c - Objective-C でプロパティの戻り値の型を検出する方法
実行時に object-c にオブジェクトがあり、そこから KVC キーのみを知っており、このプロパティの戻り値の型を検出する必要があります (たとえば、NSArray か NSMutableArray かを知る必要があります)。どうすればそれを行うことができますか? ?
objective-c - 独自の (共有ではない) NSUserDefaults オブジェクトを使用した KVO およびバインディングの問題
アプリケーションで NSUserDefaults をサブクラス化しています。これの副作用は[NSUserDefaults sharedUserDefaults]
、 を使用できないことです。独自の静的デフォルト オブジェクトを提供するクラス メソッドが必要です。これはコードの問題ではありませんが、バインディングを使用して設定 UI を接続しているため、難しいことがわかりました。
共有された NSUserDefaultsController は共有されたデフォルトを使用するので、それはありません。代わりに、ウィンドウ コントローラーに独自のデフォルト コントローラーを作成し、それに静的なデフォルト オブジェクトを提供して、それにバインディングを接続することができます。ただし、これは完全には機能しません。デフォルト オブジェクトで KVO を使用しようとしたときに、変更通知を受け取りませんでした。通常の NSUserDefaults オブジェクト (サブクラスではない) を使用してこれを再試行しましたが、KVO 通知はありませんでした。共有デフォルト オブジェクトを代用すると、KVO は私の期待どおりに機能します。
共有デフォルトを使用していないときにバインディングと KVO を機能させる方法について、誰かアイデアはありますか?
objective-c - NSTableView が入力された後の行の自動選択を無効にする
バインディングを使用してリンクされた Core Data が取り込まれた 2 つの NSTableView があります。NSTableView1 で行が選択されると、NSTableView2 が設定され、その最初の行が選択されます。NSTableView2 に対応する NSArrayController をその selectionIndex に KVO で登録しました。これは、NSTableView2 で行が選択されたときにメソッドが実行されるようにするためです。私の問題は、NSTableView1 で行が選択されると、NSTableView2 の最初の行が選択され、メソッドがトリガーされることです。NSTableView2 で行を自動的に選択することなく、NSTableView1 で行を選択して NSTableView2 に入力できるようにしたいと思います。これはどのように達成されますか?
objective-c - ココアでのKeyValueの観察、変更プロパティの内省
ブールプロパティでNSObjectメソッドを監視するキー値を使用しています。
このキーパスの値の最も興味深い部分は、常にYES/NOの間で反転するBOOLです。変更ディクショナリから得られるもののほとんどはkind=1です。とにかく、実際の変更値が何であるかを確認するために、観察しているオブジェクトをプローブせずにありますか?
ありがとう。
iphone - 実行時にIDを具象クラスに動的に型キャストする方法は?
1 つの UIViewController に使用する dataSource がいくつかあります。私のView Controllerは、実行時に特定のプロパティの状態を追跡するためにKeyValue Observingを使用しています。dataSource を交換するときは、それらのプロパティの監視を停止する必要があります。問題は、実行時の dataSource のクラスがわからないため、次のようなものは無効です。
コンパイラは、オブジェクトのインターフェイスを知るために具象クラスを必要とします。この特定のケースで dataSource のクラスを取得してから、上記の removeObserver:forKeyPath: セレクターの dataSource を typcast するにはどうすればよいですか? クラスの名前を NSString インスタンスにキャッシュし、切り替えるたびにそれを参照するよりも、動的でスマートなものを好みます。つまり、私はいつでも次のようなことができます:
ありがとう。
cocoa - 「多対」の関係をプロパティとしてモデル化する必要がありますか?
Key-Valueコーディングプログラミングガイド、Key-Value監視プログラミングガイド、モデルオブジェクト実装ガイドを読み、トピックに関する多くのStackOverflowエントリを読み、さまざまなモデリングシナリオを試した後、私はよく理解しているように感じます。データをモデル化する方法。
プライベートivarに裏打ちされた、すべての属性とto-one関係に宣言されたプロパティを使用することになります。プライベートに書き込み可能である必要がある読み取り専用属性の場合readonly
、インターフェイス宣言で属性を使用してから、ファイルで宣言されたクラス拡張.h
の属性でプロパティを再宣言します。クラスメソッド内では、常にドット構文でプロパティアクセサーを使用し、プライベートivarに直接アクセスすることはありません。readwrite
.m
ただし、まだ戸惑うことが1つあります。特に、コレクションがパブリックに不変であるがプライベートに変更可能である場合(つまり、モデルオブジェクトのコンシューマーはコレクションにオブジェクトを追加または削除できませんが、コレクションのコンテンツは、クラスによって非公開で管理されます)。
私は、to-many関係(、、など)にKVCアクセサーメソッドを実装する方法を理解してcountOf<Key>
いobjectsIn<Key>AtIndex
ます。これは、これまで私がたどってきたルートです。
ただし、宣言されたプロパティを使用して関係を公開し、KVCアクセサーメソッドを実装しないサンプルコードをいくつか見てきましたが、それでもKey-Valueを監視できます。例えば:
コンシューマオブジェクトがキーパスのMyModel
インスタンスのオブザーバーとして自分自身を追加した場合、"transactions"
トランザクションがコレクションに追加またはコレクションから削除されるたびに通知されtransactions
ます(変更がメソッドを介して行われているmutableArrayValueForKey:
場合)。
私には、コレクションKVCアクセサーを手動でコーディングする必要がなく、コードをクリーンに保つため、これは多くの関係を公開するための最もクリーンな方法のように思えます。
しかし、それはAppleのドキュメントで宣伝されている方法ではないようで、それが機能するという事実が信頼できない副作用にすぎないのではないかと思わずにはいられません。
ですから、私が取り組み始めているプロジェクトの実際のモデルクラスでいずれかの手法に取り組む前に、経験豊富なCocoa開発者の意見やアドバイスをもらいたいと思います。
したがって、問題は、プロパティを使用してto-many関係をモデル化する場合でも、KVCアクセサー/ミューテーターメソッドを実装する必要があるかどうかです。
アップデート
上記の例のように、to-manyプロパティをとして宣言した場合でもreadonly
、外部コードmutableArrayValueForKey:@"transactions"
はモデルオブジェクトを呼び出して、コレクションを変更できます。これは、宣言されたプロパティをto-many関係に使用することは道のりではないことを示しているようですが、それでも私はそれを完全に理解していないように感じます...
objective-c - NSArrayController を介してモデルの変更を通知する方法は?
のにバインドされているNSView
サブクラスがありarrangedObjects
ますNSArrayController
。配列にアイテムが挿入または削除されると、ビューに通知されます。配列に格納されているモデルの属性が変更された場合に通知を受けるにはどうすればよいですか?
配列に追加されたすべてのアイテムのすべての (関連する) 属性にビューをオブザーバーとして追加する必要がありますか?
配列にアイテムが追加または削除されるobserveValueForKeyPath:ofObject:change:context:
と、NSView
サブクラスで通知されます。配列に格納されているモデルへの変更は通知されませんが、挿入が通知されるたびに、ビューをオブザーバーとして新しいアイテムの属性に追加できます。これはこれを行うための最良の方法ですか?
何が起こるかを確認できるようにモデル クラスをオーバーライドし、適切な属性へのオブザーバーとして自分自身を追加する列にバインドされているaddObserver
ことに気付きました。これを自動的に行うことはできますか、それとも手動で監視を設定する必要がありますか?NSTableView
arrangedObjects