問題タブ [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.
cocoa - 複数のキーパスを組み合わせたバインディングを持つことは可能ですか?
数量値を持つオブジェクトがあるとします。
また、これらのオブジェクトの配列を保持する配列コントローラーがあります。
さらに、合計の割合の列 (つまり、すべての行の数量の合計に対する特定の行の数量の割合) を持つテーブルがあり、バインディングを介して適切な値を入力する必要があります。
これを行う方法としては、この列を arrayController.arrangedObjects.@sum.quantity を arrayController.arrangedObjects.quantity で割った値にバインドすることが考えられます。
これを行うことは可能ですか?
そうでない場合、これと同じ目的を達成するための代替手段を提案できますか?
objective-c - バインディングが関係している場合、NSError プレゼンテーションをオーバーライドするにはどうすればよいですか?
Cocoa Bindings で私が常に悩まされてきた問題の 1 つは、エラーの表示です。たとえば、ユーザーがフォーマッタが接続されたテキスト フィールドに間違った値を入力した場合などです。通常、私はwillPresentError:
レスポンダー チェーンのどこかをオーバーライドしますが、私の問題は、Bindings システムによって作成された NSError オブジェクトに、何が失敗したか、またはカスタマイズしたいエラーであるかどうかを判断するのに十分な情報が含まれていないことです。式からバインディングを完全に削除して、検証の問題が発生したときに独自のエラーを作成することもできますが、そうすると便利なものを捨ててしまうような気がします。
NSControl デリゲート メソッドを実装し、失敗したコントロールをビュー コントローラーのインスタンス変数に格納することで、これを回避することができました。ロールアラウンドまでに非 nil である場合、willPresentError:
何が検証に失敗したかがわかります。
これは、ファーストレスポンダが変更されたときに機能しますcommitEditing
が、View Controller を呼び出したときには機能しないため、私にとっては部分的にしか役に立ちません。
私が見ることができる他の唯一のオプションは、方程式から NSFormatter を取り出し、validateValue:forKey:error:
検証を処理するために Core Data マネージド オブジェクトを使用することです。これは、フォーマッタを使用する場合ほど意味がありませんが、少なくとも NSError オブジェクトを完全に制御できます。
エラー処理でこの種の切断が発生するには、何かが欠けているに違いないと感じています。助言がありますか?
cocoa - 既存のクラスにバインドするための複合プロパティを追加する最良の方法は何ですか?
高さと幅のプロパティを持つ Size クラスがあるとします (実際には、クラスはこれよりも少し複雑ですが、Size が良い例です)。
これを UI で $width x $height として表示したいと考えています。
これを行う明白な方法は、幅と高さに依存する寸法プロパティにバインドすることです。
私の質問は、この新しいプロパティを追加するのに最適な場所はどこですか?
モーダルで Size クラス自体に追加することもできますが、別のコントローラーが異なる文字列を表示したい場合は、さらに別のプロパティを作成することになります。また、私の場合、Size クラスはいくつかの異なる場所で使用されるフレームワークにあるため、これを行うのは少し気が進まない (ただし、すべてコードから制御できる可能性が高い)。
ビュー/コントローラーを含むプロジェクト内の Size クラスにカテゴリに追加して、使用されることがわかっている場所でのみ利用できるようにすることができますが、さまざまな場所で、カテゴリが過剰に使用される傾向があるという提案を見てきました、そしてこれがそれらのケースの1つであるかどうか疑問に思うことを余儀なくされています.
単一の Size インスタンスの場合、それを含むコントローラー クラスでプロパティを作成できますが、Size の配列がある場合、これはより困難になります。
サイズ オブジェクト全体にバインドし、トランスフォーマーを使用してそれらを文字列に変換することもできますが、サイズの配列にバインドすると、配列の各要素をトランスフォーマーで新しい配列に変換する必要が生じます。醜い。
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 サブクラスの値を読み取って設定するためのこれまでのコードは次のとおりです。
objective-c - NSArrayController を介してモデルの変更を通知する方法は?
のにバインドされているNSView
サブクラスがありarrangedObjects
ますNSArrayController
。配列にアイテムが挿入または削除されると、ビューに通知されます。配列に格納されているモデルの属性が変更された場合に通知を受けるにはどうすればよいですか?
配列に追加されたすべてのアイテムのすべての (関連する) 属性にビューをオブザーバーとして追加する必要がありますか?
配列にアイテムが追加または削除されるobserveValueForKeyPath:ofObject:change:context:
と、NSView
サブクラスで通知されます。配列に格納されているモデルへの変更は通知されませんが、挿入が通知されるたびに、ビューをオブザーバーとして新しいアイテムの属性に追加できます。これはこれを行うための最良の方法ですか?
何が起こるかを確認できるようにモデル クラスをオーバーライドし、適切な属性へのオブザーバーとして自分自身を追加する列にバインドされているaddObserver
ことに気付きました。これを自動的に行うことはできますか、それとも手動で監視を設定する必要がありますか?NSTableView
arrangedObjects
objective-c - いつオブザーバーを削除する必要がありますか? オブザーバーを削除する前のオブジェクトの割り当て解除に関するエラー
クラスの 1 つでキー値監視を使用しようとしています。init メソッドでオブザーバーを登録し、dealloc でそれらを削除/登録解除しましたが、デバッグ プリントによると、dealloc メソッドが呼び出される前に次のエラーが発生したようです。
クラス TekkPoint のインスタンス 0x583870 の割り当てが解除されていますが、キー値オブザーバーがまだ登録されています。観測情報が漏洩しており、誤って別の天体にくっついてしまう可能性さえあります。NSKVODeallocateBreak にブレークポイントを設定して、デバッガーでここで停止します。現在の観測情報は次のとおりです: (コンテキスト: 0x0、プロパティ: 0x536400> コンテキスト: 0x0、プロパティ: 0x55aba0> )
オブザーバーを削除する特定の方法はありますか? それとも、それらを削除する必要がある特定の場所ですか?
この質問によると、私は正しいことをしていますが、なぜこのエラーメッセージが表示されるのでしょうか?
これが私のdeallocルーチンです:
私の実装で奇妙なことに注意すべきことの 1 つは、オブザーバーをオブザーバーに追加したり、オブザービーから削除したりしていることです。これにより、問題が発生する可能性がありますか?
cocoa - BOOL 値にバインドされた NSTableColumn
私は NSTableView を NSArrayController にバインドしています。私のモデルには BOOL フィールドがあります。その値を列にバインドしようとしています。正しく表示されます (値が YES の場合は 1、値が NO の場合は 0)、読み取り専用です。=(値を編集しようとしても送信できません-Enterキーを押しても何も起こらず、セッターは呼び出されません。列は編集可能です。
IB で正常にバインドできます。通常どおりバインドするだけで、すべて動作します。しかし、私はプログラムで同じことを行うことはできません=(
それが列の作成および追加方法です。
BOOL 値にのみ問題があります。同じ列を他のフィールドにバインドすると (keyPath を変更するだけで)、すべて正常に動作します。
objective-c - ネストされたNSMutableArraysでNSArrayControllerを使用する(Cocoaバインディングの質問)
次のオブジェクトを持つNSArrayControllerがあります。
最初の2つのキーを表示するNSTableViewを備えたシンプルなGUIがあり、最初のTableViewの選択されたアイテムのMutableArray(タスク)のコンテンツを表示する2番目のNSTableViewが必要です。
これどうやってするの?