問題タブ [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.

0 投票する
2 に答える
1497 参照

cocoa - Core Dataと抽象エンティティを使用してマスター/詳細インターフェイスを作成するにはどうすればよいですか?

Appleには、簡単なマスター/詳細インターフェイスを作成するためのちょっとしたチュートリアルがあります。Interface Builderは、CoreDataエンティティから自動的に生成します。しかし、私は単純な例よりも複雑なことをしようとしていて、それを機能させるためにしばらく苦労してきました。

CoreDataドキュメントベースのアプリケーションがあります。モデルには、抽象エンティティのページと、ページのいくつかの具体的なサブエンティティが含まれています。すべてのページにはいくつかの共通の属性(「名前」など)があり、それらはページで定義されています。明らかに、サブエンティティには固有の属性があります。

ユーザーがマスターリスト(NSTableView)内のすべてのタイプのページを表示できるようにするインターフェイスが必要です。ページを選択すると、表示される詳細フィールドは、ページの種類によって異なります。

これが私が今持っているものです:

マスターリストが表示されるメインのnibファイルと、ページに共通するすべてのフィールドがあります。各ページタイプには、特定のフィールドを持つペン先があります。メインのnibファイルにメインのNSArrayControllerがあり、NSTableViewにデータが入力されています。各ページ固有のペン先にもNSArrayControllerがあるので、詳細フィールドを現在の選択の属性にバインドできます。すべてのNSArrayControllerは同じように構成されており、すべて同じmanagedObjectContextと同じselectionIndexesにバインドされています。

私はアーロンヒレガスのビュースワッピングの方法を使用しています。彼は彼のココアの本で説明しています。そこで、NSTableViewSelectionDidChangeNotificationsに登録しました。これを受け取ると、メソッドswitchViewが呼び出されます。

switchViewは、現在選択されているオブジェクトを調べ、それがどのタイプのページであるかを確認し、Hillegassの方法に従って適切なnibファイルをスワップします。

1つのタイプのページのみを追加するとすべて正常に機能しますが、2番目のタイプのページを追加するとすぐに、次のエラーが発生します。

オブジェクトのキーパスselectionIndexesの値の設定エラー(バインドされたオブジェクトエンティティから:ページ、選択されたオブジェクトの数:1):[valueForUndefinedKey:]:エンティティNoColPageは、キー側のキー値コーディングに準拠していません。

エラーの最後の部分は理にかなっています。間違ったペン先を表示しようとしてスタックしているため、このオブジェクトには存在しないフィールドにバインドしようとしています。

すべてのNSArrayControllerが同じ場所にバインドできるように、selectionIndexesフィールドをMyDocumentに追加しました。私はこれについて何日も苦しんでいて、それを理解することができません。何か案は?

それが役立つ場合は、ここにダウンロードできるサンプルプロジェクトがあります。この問題に関連するものだけをプロジェクトから新しいダミーアプリケーションに抽出し、それをテストして試してみました。

PS:CoreDataエンティティからマスター/詳細インターフェイスを生成するためのInterfaceBuilderのツールは、抽象エンティティの場合とは異なります。スーパーエンティティの属性のフィールドのみを作成します。

編集:ジョシュアは何かに取り組んでいると思いますが、残念ながらそれは機能しません-私は同じ問題に遭遇し続けます。-unbind:はキーパスではなく文字列定数を期待していることを理解していなかったため、最初は苦労していました。

私はいくつかのバリエーションを試しました。現在表示されているnibのアレイコントローラーを追跡します。ここで、現在表示されているページタイプを追跡し、別のページタイプを表示しようとしている場合にのみバインド解除/再バインドします...

これがコードの関連セクションです。

}

0 投票する
3 に答える
4474 参照

cocoa - NSArrayController の初期化

私のコードでコアデータに裏打ちされた NSArrayController を正しく動作させるのに問題があります。以下は私のコードです:

setSelectionIndex: を呼び出そうとすると、選択が正常に変更されたことを示す YES が返されます。ただし、その後の pageArrayController オブジェクトへの getSelectionIndex 呼び出しでは、NSNotFound が返されます。

私が理解していないのは、NSArrayController を NIB に配置し、NIB ファイルが初期化を実行できるようにすると (Interface Builder ですべて同じ属性を使用して)、NSArrayController が正しく動作することです。

行動に違いがあるのはなぜですか?NIB ファイルは、これらのタイプのオブジェクトを特別な方法で初期化しますか? NSArrayController の初期化は間違っていますか?

どんな助けでも大歓迎です。ありがとう。

0 投票する
2 に答える
564 参照

core-data - NSArraycontroller から削除されたオブジェクトは、クリックされるまでテーブルに残ります

アプリケーションの AppDelegate の managedObjectContext にバインドされた NSArraycontroller があります。ダウンロード キューとして機能します。アイテムはプログラムで NSArraycontroller に追加されます

これには 2 つのフィールドを示すテーブルがあり、それぞれの列の値は、前述の NSArraycontroller に個別にバインドされています。新しいダウンロードが開始されると、プログラムによって NSArraycontroller から削除されます。

ダウンロードを開始する前にキューからダウンロードを削除するボタンを追加しました。ボタンは NSArraycontroller の remove: アクションにバインドされており、テーブルで選択したアイテムを削除する必要があります。

私の問題は、削除ボタンをクリックしても、選択したアイテムがテーブルから削除されず、テーブル内の別のエントリをクリックするまでそこに残ることです。項目があった行を選択すると、マウス ボタンが押されている間、項目がまだそこにあるかのように選択されますが、値はありません。

削除ボタンをクリックすると、コンソールに次のように表示されます。 -[NSCFDictionary _setUnprocessedDeletion__:]: unrecognized selector sent to instance 0x2000f2220

プログラムを使用してテーブルからアイテムを削除すると、正常に [[downloadsArray content] removeObjectAtIndex:0]; [downloadsTable reloadData]; [downloadsTable deselectAll:nil]; 動作するように見えますが、マウスボタンが押されたときにのみ選択され、選択されたままになる非表示のアイテムが残っています。

削除ボタンの enabled 属性を NSArraycontroller の canRemove にバインドしましたが、これは正しく機能します。

キュー内のアイテム数を示すラベルがあります。これは、NSArraycontroller、arrangedObjects、@count にバインドされています。これは、アイテムを追加するときは正しく機能しますが、削除するときは機能しません。

私が間違っていることについてのアイデアは大歓迎です。

0 投票する
1 に答える
251 参照

cocoa - NSArrayControllerのコンテンツに追加されたアイテムに応答してアクションを実行するにはどうすればよいですか?

AppDelegateの" "プロパティNSArrayControllerをコンテンツとする所有者がいます。servers

の" "プロパティにNSTextFieldバインドされているがあり、の" "および" "アクションにボタンがアタッチされています。selection.nameNSArrayControlleradd:remove:NSArrayController

「追加」ボタンをクリックするNSTextFieldと、が最初のレスポンダーになり、ユーザーがサーバーの名前をすぐに編集できるようになります。

私の現在の戦略は、の " arrangedObjects"プロパティを観察することですが、NSArrayControllerから返されるのNSKeyValueChangeKindKeyNSKeyValueChangeSetting列挙型だけです。NSKeyValueChangeInsertionテキストフィールドにファーストレスポンダーになるように依頼できるように、値を取得したいと思っていました。

私の質問は、これを正しい方法で行っているのか、それともこれを達成するためのより一般的な方法があるのか​​ということです。私はバインディングをうまく接続しています。自分の動作をクラックに挿入する方法に苦労しています。

0 投票する
1 に答える
272 参照

memory-management - コアデータとカスタム NSCell

Log2 つのエンティティ(属性textdate)のコア データを使用し、 からへTagの多対多のtags関係を持つおもちゃのアプリを構築しています。LogTag

ログをテーブルに表示したいので、次のようにします。

  • エンティティを( pic )に設定して IB にNSArrayControllerインスタンスを作成しましたLogControllerLog
  • NSTableViewにバインドされた列を持つ1 列を作成しましたLogController写真
  • LogControllerを使用して、アプリ内のデリゲート ( AppDelegate) をリンクしましたIBOutletAppDelegateも持っていmanagedObjectContextます。
  • プロパティを持つカスタムNSCellクラスを作成し、それをセルに描画しましたNSStringmainTexttagsText
  • メソッドで上記の 2 つのセル プロパティを設定しAppDelegateます- (void)tableView: willDisplayCell: forTableColumn: row:。(MainControllerテーブルのデリゲートでもあります)。現在のtagsTextログのタグを取得し、それらを単一のログに連結しますNSString

複数のタグを表示する行をマウスで選択すると、アプリがEXC_BAD_ACCESS. エラーが発生したのはそのときだけですが、何が原因なのかわかりません。

0 投票する
2 に答える
2012 参照

cocoa - バインディング - マスター詳細配列コントローラー

私はココアを学んでいて、障害にぶつかっているので、誰かがこれについて助けてくれることを本当に願っています.

単純なポーカー トーナメントをモデル化しようとしています。今のところ、私のエンティティは単なる Tournament (番号付き) と Player (名前付き) です。トーナメントにはプレイヤーの配列があります。

2 つの独立したテーブル ビューをバインドして、トーナメントとプレーヤーを適切に表示できます。しかし、プレーヤー テーブル ビューには、最初のテーブル ビューから選択したトーナメントに属するプレーヤーのみを表示したいと考えています。

それぞれに独自のアレイ コントローラがあります。2 番目の (プレイヤー) テーブルでさまざまなバインディングを試しましたが、うまくいきませんでした。誰かがこれを達成しましたか?もしそうなら、オンラインでの例はほとんどないので、私のために詳しく説明していただけますか.

  • 更新 必要な場所にほぼ到達できるようになりました。ほとんどの場合、リアル アンド エラーと何時間にもわたるグーグル検索によって行われます。プレーヤー AC のコンテンツをトーナメント AC にバインドし、コントローラー キー「選択したオブジェクト」とモデル キー パス「プレーヤー」を使用します。これは、トーナメント エンティティの配列の名前です。

プレイヤー テーブル ビューの列を、この 2 番目のプレイヤー AC、コントローラー キー配置オブジェクトにバインドしました。しかし、Model Key Path には何を入れるのでしょうか? そこに@countを入れると、選択したトーナメントの正しい数のプレーヤーが得られるので、それが機能していることはわかっています。しかし、'name' と 'player.name' はダメです。'item.name' または 'players.item.name' のようなものはありますか?

すっごく近いです、これまでの助けに感謝します: 代替テキスト

0 投票する
1 に答える
1227 参照

cocoa - バインディングに従ってテーブル ビューが更新されない - パート 2

タイトルはこの質問から借用しましたが、これは重複していません。その質問者にとって何が悪かったのかについては、私の回答を参照してください。私はその答えの作者であり、私の問題はそれではありません。

3 つの列を持つテーブル ビューがあり、その値バインディングはarrangedObjects配列コントローラーの 3 つのプロパティにバインドされています。配列コントローラーは、ドキュメント オブジェクトの にcontentArrayバインドされています。visitationResultsその配列内の項目は、モデル クラス (VisitationResult) のインスタンスです。selectionIndexesまた、配列コントローラとsortDescriptorsドキュメントのプロパティをバインドしました。

私はいくつかのアクセサーを介して自分のプロパティを変更しています:

このNSLogステートメントが実行され、配列コントローラーがモデル オブジェクトを収集して配置していることを確認します。これは、私が自分のプロパティを調べて、ドキュメントの KVO 通知を取得していることを意味します (これは、以前の質問者の問題である、プロパティをバイパスするという問題が、私が抱えている問題ではないことを証明しています)。

NSLogモデル オブジェクト クラスのアクセサ メソッドにステートメントを追加しました。それらの 1 つは、オブジェクトを並べ替えるために、配列コントローラーによって呼び出されています (そのプロパティが並べ替えキーです)。配列コントローラーが知らない他の 2 つは呼び出されません。

したがって、テーブル ビューは空白のままです。

0 投票する
1 に答える
202 参照

objective-c - 配列コントローラーを使用して、別のポップアップでの選択に応じて、あるポップアップでのビューを制限します。コアデータベースではない

コア データ ベースではないアプリに取り組んでいます。データ フィードは一連の Web サービスです。

データ フィードから 2 つの配列が作成されます。1 つ目は季節データを保持し、各配列オブジェクトは NSDictionary です。2 つの NSDictionary エントリは、ポップアップに表示されるデータ ('seasonName') と、そのシーズンに定義された一致によって (外部テーブルで) ポインターとして機能する ID ('seasonID') を保持します。

2 番目の配列も NSDictionaries のコレクションです。2 つのエントリは、ポップアップに表示されるデータ (「matchDescription」) と、最初の配列の NSDictionaries で定義されたシーズン ID を指す ID (「matchSeasonId」) を保持します。

2 つの NSPopUp があります。最初の選択に応じて、最初にシーズン名を表示し、2 番目にそのシーズンに定義された試合を表示します。

私はバインディングが初めてなので、何か明らかなことを見逃していたらすみません。次のようにArrayControllersを使用してみました:

SeasonsArrayController: appDelegate seasonsPopUpArrayData にバインドされたコンテンツ。

seasonsPopup: SeasonsArrayController.arrangedObjects にバインドされたコンテンツ。SeasonsArrayController.arrangedObjects.seasonName にバインドされた content 値

季節の名前はよくわかります。もちろん、同様のルートで試合を見ることもできますが、ハイライトされたシーズンの試合にリストを制限するのではなく、すべての試合を見ることができます。

私が見つけることができるすべてのチュートリアルは、コアデータを中心に展開し、そこで定義された関係を利用しているようです. ここにはそんな贅沢はありません。どんな助けも非常に感謝して受け取りました。

0 投票する
3 に答える
3391 参照

cocoa - NSArrayController にバインドされた NSTableView に行インデックスを表示する

NSArrayController にバインドされた NSTableView があります。テーブル行のインデックスを示すテーブル列の 1 つが必要です。これは、自分で NSTableDataSource を実装すると簡単に実行できますが、バインドされたテーブル ビューではわかりません。ここで、arrangedObjects (つまり @index) の数を取得する @count キー パスのようなものを探していると思いますが、これは明らかに欠落しています。

2 つの説明:

  1. 各行に表示されるインデックスは、その行のインデックスであり、モデルまたは配列コントローラーでデータが実際に配置される方法とはまったく関係ありません。たとえば、データ全体が 10000 アイテムである場合、インデックスは 1 から 10000 に移動する必要があります。ユーザーが検索語を入力し、テーブルにアイテムが 4 つしか表示されていない場合、数値は 1 から 4 に移動する必要があります。表示されているアイテムは、実際には元の配列全体からのものです。
  2. クライアントからこれをするように頼まれたので、これが必要です:-)。クライアントには、特定の行の前後の行数を推定できる方法が必要です。たとえば、追加された行数を知りたいとします。
0 投票する
3 に答える
1233 参照

cocoa - NSArrayController addObject null を返します

2 つの NIB を備えたコア データ アプリケーション、NSTableView のペアを備えたメイン ウィンドウ、およびコンテンツを追加するためのフォームがあります。フォームには NSTextView と NSTextField があります。コア データに 2 つのエンティティがあり、2 つの NSArrayController でコンテンツを管理します。1 つの NSArrayController を使用すると、AppDelegate の次のコードでコンテンツを追加できます。

しかし、私の AppController クラスのこのコードは常に null を返します。

chapterArrayController がコア データの Chapter エンティティに接続されていないようですが、IB のバインディングは正しいです。これは複数のペン先と関係があると思いますが、ここでちょっと途方に暮れています。

正しい方向へのポインタは高く評価されます。

ありがとう。

更新 2: 次のような JBAddChapter という名前のクラスを作成しました。

JBAddChapter.h

JBAddChapter.m

メイン ウィンドウの IB に 2 つのボタンを作成し、1 つを上記の testArrayControllers IBAction に接続しました。AppController とこの IBAction に接続するもう​​ 1 つのボタン:

standAloneTestArrayControllersJBAddChapter の IBAction から呼び出すと、すべて正常に動作します。JBAddChapter のファクトリ メソッドを使用して AppController から同じメソッドを呼び出すと、アレイ コントローラは nil になります。

では、配列コントローラーが一方のメソッドからは nil を返すのに、もう一方のメソッドからは返さないのはなぜでしょうか? 私が知る限り、IB のすべてのバインディングは正しいです。