問題タブ [key-value-coding]
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.
iphone - Objective-C/Cocoa Key-Value コーディングと配列について
iPhoneアプリのキー値コーディングを使用して配列にデータを入力する「正しい」方法を見つけようとしています。私はうまくいくものを思いつきましたが、それはかなりハックです。基本的に、私は XML ドキュメントを一連のコード生成モデルに解析しています。XML が次の形式であるとします。
Bar 要素を表す生成されたオブジェクトでは、サブノード用に定義された NSMutableArray があります。
したがって、デフォルトでは、Bar のインスタンスで setValue:forKey: を呼び出すと、NSMutableArray のインスタンスが Item オブジェクトの単一のインスタンスで上書きされます。これを機能させるために私が現在行っていることは、ハッキーになるところです。配列インスタンス変数の名前を別のものに変更しました。名前の複数形を考えてみましょう:
これにより、setValue:forKey: のデフォルトのアクセサーが失われます。次に、このメソッドを Bar 実装に追加しました。
そして、すべてが機能します!しかし、これを行うためのより良い方法があるに違いないと確信しています! Key-Value Coding Programming Guide を読みましたが、配列アクセサーがどのように機能するかがよくわからないため、何かが欠けているに違いありません。countOf: と objectInAtIndex: を KVC プログラミング ガイドが示すように実装しようとしましたが、それでも NSMutableArray が Item タイプのインスタンスで上書きされます。
cocoa - Interface Builder> Inspector> Bindingsの「ControllerKey」とはどういう意味ですか?
それらのすべてのフィールドとその意味を説明しているドキュメントは見つかりません。特に「コントローラーキー」は私にはわかりません。
core-data - NSManagedObjectサブクラス(CoreData)の数値に対するKVCコンプライアンス
NSManagedObjectサブクラスを並べ替える基本的なテストを試みています。基本的なサブクラス「TestClass」を2つの属性で設定しました:stringField
とnumberField
。標準のObj-C2.0アクセサープロトコルを使用します。
このエンティティのインスタンスをフェッチしようとすると、どちらの属性にも基づいてフェッチできます。ただし、ソート記述子を使用すると、numberField
はKVCに準拠していないと言われます。
モデル内で、numberField
をInt64に設定しましたが、混乱しています。ラッパー(NSNumber)がKVCの問題を処理すると思いました。これを機能させるには何をする必要がありますか?
cocoa - アレイコントローラーの特定のアイテムにバインドするCocoa
の値を配列内の特定のアイテムにNSArrayController
バインドするためにを使用することは可能ですか?NSTextField
特に、配列の最初の項目のプロパティにバインドし、配列が空の場合は何も表示しないようにします。
shows just "("を使用arrangedObjects.command
すると、アイテムごとにカンマ区切りの文字列を含む複数行の文字列を表示しようとしている可能性があります。最初の文字列が必要です。
objective-c - NSArrayController のオブジェクト数を制限する
アプリである種の「トップ 25」リストを作成しようとしています。NSPredicate を使用して配列コントローラーのコンテンツをフィルター処理しましたが、結果の数を 25 オブジェクトに制限したいと考えています。どうすればそれができますか?
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 パレットを作成したくないため、プログラムでこれを実行しようとしています。)
iphone - Interface Builder で Nib Name フィールドを設定するときの例外
Interface Builder の nib からビュー コントローラーを読み込もうとしています。私の基本的なセットアップはこれです:
MainWindow.xib の内容: すべての通常のもの、アプリ デリゲート インスタンス、ウィンドウなど。
ルート ビュー コントローラーとして UIViewController を持つ UINavigationController。UIViewController の nib 名は、View Controller を含む xib の名前に設定されます。
別の xib のビュー コントローラーでは、ファイルの所有者のタイプがそのビューのコントローラー クラスに設定されています。
ビューが読み込まれるたびに (つまり、アプリの起動時)、コントローラー クラスがキーのキー値コーディングに準拠していないことを示す例外がスローされます [ここにランダム変数名を挿入]。ほとんどの場合、キーはボタンに付けた名前か、IBOutlet として設定した別のものです。
なぜこうなった?私は何が欠けていますか?これらの変数ごとにプロパティを作成して、KVC 準拠のアクセサーを生成しようとしましたが、それでも例外がスローされます。
どんな助けでも素晴らしいでしょう、ありがとう!
cocoa - 複数のキーパスを組み合わせたバインディングを持つことは可能ですか?
数量値を持つオブジェクトがあるとします。
また、これらのオブジェクトの配列を保持する配列コントローラーがあります。
さらに、合計の割合の列 (つまり、すべての行の数量の合計に対する特定の行の数量の割合) を持つテーブルがあり、バインディングを介して適切な値を入力する必要があります。
これを行う方法としては、この列を arrayController.arrangedObjects.@sum.quantity を arrayController.arrangedObjects.quantity で割った値にバインドすることが考えられます。
これを行うことは可能ですか?
そうでない場合、これと同じ目的を達成するための代替手段を提案できますか?
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関係に使用することは道のりではないことを示しているようですが、それでも私はそれを完全に理解していないように感じます...
cocoa - NSTextFieldCell の編集値に基づいてバインドされた辞書を更新します
私は、NSCoding/plist ベースのアーカイブから Core Data の使用への古いコード (10.2 時代) の移植に取り組んでいます。カスタム NSTextFieldCell を持つ NSOutlineView があります。アウトライン ビューは、データを提供するために NSTreeController にバインドされます。
バインディング モデルは次のようになります。
NSTreeController: 管理オブジェクト コンテキスト -> Controller.managedObjectContext
NSOutlineView の NSTableColumn 値 -> Tree Controller:arrangedObjects:itemDictionary
NSOutlineView には、テキスト フィールドの横に画像を追加するカスタム NSTextFieldCell サブクラスがあるため、NSManagedObject の値を itemDictionary と呼ばれる NSMutableDictionary として渡し、タイトルと isChecked キーの値をプルして設定できるようにします。
問題が発生しているのは、テキスト フィールドの値を更新し、その変更された値を管理対象オブジェクト インスタンスに戻すことです。ユーザーがタイトルの値をダブルクリックして編集すると、それが に渡されますが-(id)objectValue
、次の手順で更新を NSManagedObject インスタンスに伝達する方法がわかりません。NSTextFieldCell サブクラスの値を読み取って設定するためのこれまでのコードは次のとおりです。