問題タブ [nsarraycontroller]
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 : NSArrayController から項目を削除
NSTableView にバインドされた NSArrayController があります。これで、典型的な追加/削除ボタンができました。
アイテムの追加は非常に簡単ですが (メソッドを呼び出し、デフォルト値でオブジェクトを作成して追加します)、コントローラーからオブジェクトを削除する際に問題が発生します。ボタンを ArrayController の削除アクションに接続すると、これを簡単に実行できることがわかりました。しかし、これは私が望むものではありません。処理する追加のコードがあるため、オブジェクトを手動で削除する必要があります。
とにかく、オブジェクトの削除は、私が予想していたよりもはるかに複雑に思えます。すでに試しました:
また
それらのどれも機能していないようです。Objective-C コードを使用して、選択したオブジェクトを NSArrayController から削除するにはどうすればよいですか?
cocoa - バインディングを介して NSArrayController に接続された NSSearchField とのラグ インターフェイス
そのため、filterPredicate にアタッチされたバインディングを介して NSArrayController に直接接続された NSSearchField を取得しました。これにより、ユーザーはコードなしで NSSearchField を入力し、インターフェースで提示された NSArrayController 内のオブジェクトのリストをフィルタリングすることができます。 (具体的には NSCollectionView)。
NSSearchField はライブ検索を提供するために接続されているため、NSCollectionView は、ユーザーが入力を停止するのを少し待った後ではなく、ユーザーが入力するとすぐにフィルター処理されます。
ただし、問題は、これによりインターフェイスが非常に遅くなることです。入力は 0.5 ~ 1 秒と大幅に遅れ、ユーザーが入力する検索文字列の各部分について、NSCollectionView がアイテムの再配置をすべてアニメーション化しようとしているように見えます。
私が望むのは、検索がライブであることですが、検索フィールドへの入力は流動的であり、結果はできるだけ速くフィルタリングされることです。バインディングを介してこれを行う方法はありますか、または別のスレッドで filterPredicate をトリガーするカスタム コードを挿入する必要がありますか?
(NSArrayController にカスタムの並べ替えアルゴリズムを設定していることに注意してください。それを削除すると、遅延が少し解消されるようですが、完全ではありません。)
cocoa - NSArrayController filterPredicate を一時的に無効にするか、ManagedObjectContext に相談しますか?
管理対象オブジェクト コンテキスト内のクラスにバインドされた NSArrayController があります。実行時に、NSArrayController にはさまざまなフィルター述語を適用できます。特定の間隔で、適用されたフィルター述語に関係なく、NSArrayController のコンテンツを反復処理したいと考えています。
これを行うには、filterPredicate を nil に設定し、配列を反復処理した後に元に戻します。これはうまくいくようですが、それがベストプラクティスかどうか疑問に思っていますか? 代わりに、Managed Object Context を手動でポーリングする必要がありますか?
cocoa - NSArrayController と cocoa バインディングを使用して NSTextField で従業員の平均給与を表示する方法
私はココアバインディングを初めて使用するので、ココアバインディングを使用して、従業員の平均給与を単純に計算し、テキストフィールドに表示する簡単なアプリケーションを作成しようとしました。私は次の手順に従いました:
モデル クラス
Person
を作成しました: 今のところ 1 つのプロパティで -@property (読み書き、割り当て) int 給与;
アプリケーション デリゲート クラスで、可変配列を初期化しました。
/li>personArray
次のような特定のオブジェクトを使用します。IB で NSArrayController オブジェクトを削除し、そのモードを Class - に設定し、属性ペインに
Person
キーを追加しました。salary
次に、バインディング ペインで、コンテンツ配列を ApplicationDelegate クラスにバインドし、モデル キー パスを に設定しself.personArray
ます。ウィンドウに NSTextField をドロップしました。その値を ArrayController オブジェクトにバインドしました。割り当てられたコントローラ キーは -
arrangedObjects
です。割り当てられたモデル キー パス@avg.salary
アプリケーションを実行したところ、テキスト フィールドに値が表示されていませんでした。
私が間違っている可能性がある場所や、それを達成するための他の最良の方法を誰かに教えてもらえますか
ありがとう、
ミラージュ
sorting - cocoa を介して IB で実行すると、文字列の長さによるテーブルの列の並べ替えが意図したとおりに機能しない - バインディング
NSArrayController を使用して、NSTableView で従業員のリストと給与を表示するサンプル アプリケーションを作成しました。
基本的な機能は意図したとおりに機能しています。また、Selector - compare
orcaseInsensitiveCompare
が table column- の属性ペインで割り当てられている場合、並べ替えは正常に機能しますemployeeName
。
length
IB のセレクターを - としてテーブル列 - に設定して文字列の長さでソートしようとすると、問題が発生しますemployeeName
。文字列の長さで並べ替えますが、不適切です。
It is doing sorting on alternate clicks
すなわち。最初のクリックで、テーブル内のコンテンツを長さの降順で並べ替えます。次に、2回目のクリックで、コンテンツを長さの昇順で並べ替えませんが、昇順のように矢印を上に設定します。次に、3回目のクリックでコンテンツを長さの昇順で並べ替えますが、テーブル列の上に矢印を降順で設定します...
私がどこかで間違っているかどうか誰かが提案できますか?
ありがとう、
ミラージュ
objective-c - 複数のNIBのNSArrayControllerによってアクセスされるシングルトンNSMutableArray
早期警告-コードサンプルが少し長い...
アプリケーション内のどこからでもアクセスできるシングルトンNSMutableArrayがあります。複数のNIBファイルから参照できるようにしたいのですが、オブジェクトNSMutableArray
を介してUI要素にバインドしNSArrayController
ます。最初の作成は問題ではありません。NSMutableArray
NIBがロードされ、すべてが正常に表示されたときに、シングルトンを参照できます。
ただし、オブジェクトを追加または削除してを変更しても、インスタンスNSMutableArray
を更新するためにKVOが開始されるわけではありません。NSArrayController
「コントローラーの後ろで変更する」ことはココアランドの立ち入り禁止の部分と見なされていることは理解していますが、プログラムで更新しNSMutableArray
てすべての人NSArrayController
に通知する方法は他にありません(もちろん機能しない場合を除きます)。 ..)。
説明するために、以下のクラスを簡略化しました。
簡略化されたシングルトンクラスヘッダー:
簡略化されたシングルトンメソッド:
この簡略化された例では、配列内のオブジェクトのヘッダーとモデルは次のとおりです。
ヘッダーファイル:
メソッドファイル:
NSArrayController
ここで、適切なインスタンスを持つ2つのNIBファイルを想像してください。myArrayControllerInNibOne
それらをとと呼びますmyArrayControllerInNib2
。init
NIBコントローラーの各アレイコントローラーは、アレイのコンテンツを設定します。
各NIBNSArrayController
が共有配列へのバインドを正しく初期化すると、期待どおりにUIに配列の内容が表示されます。外部イベントに基づいてコンテンツが変更されたときにグローバル配列を更新する別のバックグラウンドスレッドがあります。このバックグラウンドスレッドでオブジェクトを追加する必要がある場合は、次のようにオブジェクトを配列に追加するだけです。
これは物事がバラバラになるところです。共有インスタンスにキー値がないため、グローバル配列でwillChangeValueForKey
とを呼び出すことができません(これをシングルトンクラスに追加する必要がありますか?)didChangeValueForKey
をNSNotification
起動してNIBコントローラーでキャッチし、 ;を実行することができ[myArrayControllerInNibOne rearrangeObjects]
ます。または、コンテンツnil
をアレイに設定して再割り当てしますが、どちらもハックのようです。さらに、グローバル配列に設定してNSArrayController
からnil
グローバル配列に戻すと、コンテンツがクリアされて再入力されるときにUI内で視覚的なフラッシュが発生します。
に直接追加できNSArrayController
、配列が更新されることはわかっていますが、a)他のNSArrayController
インスタンスがどのように更新されるか、b)バックグラウンドスレッドクラスをNIBインスタンスに明示的に結び付けたくない(または私がしなければならない必要があります)。
正しいアプローチは、バックグラウンドスレッドでKVO通知を何らかのaddObject
方法で起動するか、グローバル配列に格納されているオブジェクトに何かを追加することだと思います。しかし、私は途方に暮れています。
注意点として、私はCoreDataを使用していません。
どんな助けや援助も大歓迎です。
cocoa - CoreData での NSSegmentedControl の使用
クライアントの多くの予定の 1 つを、IB で予定の ArrayController にバインドされたボタンで追加または削除するコア データ アプリがあります。予定のコンテンツは、フィード リストで選択されたクライアントから取得されます。SegmentedControl を使用したいのですが、私が知る限り、予定のオブジェクトをプログラムで追加および削除する必要があります。Marcus Zarra の著書 Core Data on p54 のコードを使用して予定を追加することに成功しましたが、選択した予定を削除する方法がわかりません。カスタム テーブル セルを使用していますが、これが問題を複雑にしている可能性があります。
要するに、選択したオブジェクトで ArrayController の remove: メソッドに相当するものをプログラムで実現したいと考えています。
誰か助けてくれませんか?
objective-c - NSArrayController がバインドを介してアクセサ メソッドを呼び出さないのはなぜですか?
次のアクセサー メソッドを使用して、NSArrayController (thingsController) の addObject メソッドをインターセプトしようとしています。
Thing と MyDocument の 2 つのクラスがあります。Thing には name という 1 つのプロパティがあります。MyDocument には、things という名前の NSMutableArray と、thingsController という名前の NSArrayController があります。NIB では、File's Owner が MyDocument に設定され、NSArrayController の content 配列が File's Owner にバインドされ、モデル パスが things に設定されています。NSArrayController には、モードが Class に設定され、Class Name が Thing に設定されており、name という 1 つのキーがあります。MyDocument には createThing というメソッドがあります。このメソッドは最初に thingsController newObject を送信し、次に addObject を送信します。Thing の init メソッドにブレークポイントを設定すると、thingsController が newObject に送信されたときに呼び出されます。ただし、thingsController が addObject に送信されると、アクセサー メソッドの insertObject:(Thing *)thing inThingsAtIndex:(NSUInteger)index は呼び出されません。
Key-Value Coding Accessor Methods に関する Apple のドキュメントを読みましたが、準拠していると思いますが、何かが欠けているに違いありません。
どんな助けでも大歓迎です。
以下のコード...
Thing.h
Thing.m
MyDocument.h
MyDocument.m
objective-c - それ自体が別のarraycontrollerにリンクされているarraycontrollerにオブジェクトをエレガントに追加しますか?
私はOSXプログラミングに不慣れですが、一般的には気に入っています。私は次の問題を抱えています:
2つのコアデータエンティティがそれぞれのアレイコントローラーと1対多でリンクされています(ストックコントローラーと価格履歴コントローラー。後者のコントローラーはストックコントローラーにバインドされており、コントローラーキー=選択とモデルキーパス=価格履歴です。は、PriceHistoryControllerによって制御されるPriceDataPointエンティティに株式エンティティをリンクする関係です。
これはすべて私のUIの魔法のように機能し、株式を選択して、選択されたときにそれぞれに価格ポイントを追加/削除できます。ただし、これもプログラムで実行できる必要があります。
[stockController add:self]
'self'が正しいクラス/エンティティではない場合でも、選択したストックにリンクされた、正しいデフォルト値を持つ新しいオブジェクトでUIアップデートを呼び出すだけです。これは私にとって混乱の1つのポイントであり、私には理解できません(ストックコントローラーは、KVOバインディングを通じて選択された株式を認識しており、必要に応じて関係を設定する可能性が高いことを理解していますが、それがどのようにキャストされるかわかりません。 ''self'は、必要なオブジェクトタイプ(プレーンNSManagedObject
)へのかなりランダムなクラスです?次に、これを行う場合、そのオブジェクトへの参照を取得して、その値を編集できるようにするにはどうすればよいですか?ただし、さらに重要なのは、Appleの例に従って、新しい
NSManagedObject
スルーNSEntityDescription:insertNewObjectForEntity:
を作成して使用すると[stockController addObject:Newly created Object]
、追加する前に必要な値を書き込むことができますが、「親」ストックとの関係はaddObjects:
メソッドによって設定されません。私もこれを書く方法を理解できると確信していますが、Cocoaの他のすべてがとてもエレガントであるため、これは奇妙に感じるので、ここの誰かがこれを非常に迅速に解決し、エレガントな方法を教えてくれることを願っています。
cocoa - NSArrayControllerとcocoaバインディングを介してレコード数と値の集計を取得する方法
NSArrayControllerとcocoaバインディングを使用した単純なアプリケーションを試しています。アプリケーションには、列が1つしかないテーブル、レコードを追加および削除するための2つのボタン「+、-」、入力されたレコードの数とこれらのレコードの合計を表示する2つのテキストフィールドが含まれます。
ユーザーが数字のみを入力できるようにするために、NSTextFieldセルにNSNumberFormatterを割り当てました。
モデルクラス: "Transaction"には、"amount"という1つのプロパティのみが含まれています。@propertyと@synthesizeを使用して、アクセサメソッドを宣言および定義しました。
したがって、全体として、次のタスクを実行したいと思います。
- ユーザーがテーブルの各行の番号を挿入、編集、変更できるようにします。
- テキストフィールドに入力されたレコードの数を表示します。
- 他のテキストフィールドに入力された数値の集計を表示します。
私は1ポイントを達成することができます。ココアバインディングを介して、しかし私が2番目と3番目のポイントを実装しようとしたとき、それは意図したように機能していません。
私は2番目と3番目のポイントのために次のことをしました。
2番目のポイントの場合...1。テキストフィールドのバインディング設定。アレイコントローラーに値をバインドしています。2.モデルのキーパスを@count.amountとして設定します
for 3rd pt....1.テキストフィールドのバインディング設定。アレイコントローラーに値をバインドしています。2.モデルのキーパスを@sum.amountとして設定します
誰かが私が間違っているかもしれない場所や私の要件を達成するための他の方法を私に提案できますか?
ありがとう、
ミラジ