2016-08-10 15 views
0

私はCocoa Bindingsの基本的な理解を得ようとしています。本当にシンプルなプロジェクトを作りたいと思います。私はクラスPersonを持っていて、それはタイプNSStringnameという変数を持っています。ここで私は物事が仕事をしたい方法です:最も簡単なココアバインディングの例

  1. ユーザーがテキストフィールドに名前を入力し、「アップデート名」ボタン
  2. を押すと、テキストフィールドから文字列はPersonクラスのインスタンスに保存されます。
  3. Person Controller(Personクラスにバインドされている)にバインドされたラベルは、Personインスタンスの変数nameに従って自動的に値を変更します。

私はさまざまなチュートリアルやApple Mac Developer Libraryを読んで何時間も費やしましたが、それぞれの例では、テーブルでCocoaバインディングを使用する方法を示しています。はるかに単純なものを開発しようとすると、私は完全に失われていると感じます。私は基本プロジェクトを作成しました。残っているのは、すべてのバインディングを作成することだけです。私は親切に私のためのすべての接続を行い、うまくいけば私に説明を提供するように頼んでいます。 https://www.dropbox.com/sh/6hddfxyitqp6uoc/AACgaRhKBhLo6EXCVN9W6GQua?dl=0 私は今後この種のアプリを開発する予定なので、このプロジェクトはドキュメントベースのアプリです。

+0

あなたは([ココアバインディングプログラミングトピックス]読みましたhttps://developer.apple.com/library/prerelease/content/documentation/Cocoa/Conceptual/CocoaBindings/CocoaBindings.html#//apple_ref/doc/uid/10000167-BBCFBCAG)?クラス 'Person'はKVOに準拠していなければなりません。 – Willeke

+0

ラベルの値をコントローラーのControllerキー: 'selection'、モデルキーパス:' name'にバインドします。それで全部です。 – Willeke

+0

私はそれを行うだけでいくつかの例外が発生し、アプリケーションが読み込まれません。私は明らかにオブジェクトコントローラでいくつかの接続を行う必要があります。また、クラス内でKVOを実装することも可能です。 e。私の 'Person'クラスをKVOに準拠させることができますか?私が取り組んでいるのと同じ仕事を達成するための別のアプローチを提案できれば、あなたの知識を共有してください。 – Yashman

答えて

5

あなたのプロジェクトがうまくいかない理由がいくつかありますので、もう一度やり直して、最も単純なココアバインディングの例を作成してください。

  1. 新しいXcodeプロジェクトを作成し、「Cocoaアプリケーション」を選択し、「ストーリーボードを使用する」、「ドキュメントベースのアプリケーションを作成する」または「コアデータを使用する」にチェックを入れないでください。
  2. MainMenu.xibを選択し、ウィンドウを選択してテキストフィールドとラベルを追加します。
  3. オブジェクトコントローラをxibに追加します。スイッチPrepares Contentをオンにします。
  4. オブジェクト・コントローラにテキスト・フィールドをバインドします。バインドValueObject Controller、コントローラ・キーselectionおよびモデル・キー・パスname
  5. オブジェクト・コントローラーにラベルをバインドします。バインドValueObject Controller、コントローラー・キーselectionおよびモデル・キー・パスname
  6. ビルド、実行、テスト。テキストを入力し、Returnキーを押します。

コントローラーは、キーごとにKVO準拠のNSMutableDictionaryのインスタンスを自動的に作成します。テキストフィールドの内容が変更されると、テキストフィールドのバインディングはsetValue:@"New Contents" forKey:@"name"を呼び出します。これにより、ラベルのバインディングが通知され、ラベルが更新されます。プロジェクトが動作しないのはなぜ

:XIBで

  • は、オブジェクト制御の内容は、ドキュメントに接続されています。コントローラーの内容は、文書ではなく人でなければなりません。だからあなたは[<Document 0x618000100750> valueForUndefinedKey:]: this class is not key value coding-compliant for the key name.を得る。この接続を削除します。
  • クラスパーソンはKVOに準拠していません。名前が変わると、クラスPersonは変更通知を出さず、バインディングは変更に気付かない。これは、ivarの代わりにnameのプロパティを使用することで修正できます。コード内の名前を変更するのにsetValue:forKey:を使用する必要はありません。person.name = [field stringValue]はokです。
  • オブジェクトコントローラの内容は、ドキュメントのinitメソッドで設定されています。これは早すぎます.xibはまだロードされておらず、コントローラは存在しません。コンテンツをwindowControllerDidLoadNibに設定します。 addObjectの代わりにsetContentを使用しますが、addObjectを使用してください。
+0

あなたのお手伝いが大歓迎です、これは私が探していた説明です。あなたが指摘した変更を適用した後、私のプロジェクトは完全に機能しました。 – Yashman