web-dev-qa-db-ja.com

iOSで利用できるデータバインディングメカニズムはありますか?

.NETでは、DataForm.Source = Objectのようなことをするだけで、魔法が起こります。プラットフォームは、データの変更をUIフィールドからオブジェクトプロパティにルーティングし、検証を行います。 Cocoa TouchおよびCoreDataオブジェクトで同様のことを行うことはできますか?

23
fspirit

Cocoaで最も近いのは、「Key-ValueObserving」です。デスクトップCocoaフレームワークでは、バインディングを使用して、ユーザーインターフェイス要素を基になるオブジェクトにフックし、オブジェクトまたはUI要素の変更が他のオブジェクトに反映されるようにすることができます。

IOSのCocoaにはこの種のUIバインディングはありませんが、ここで説明するように、「Key-ValueObserving」を使用してデータモデルの変更をUI要素と同期させることができます。

http://developer.Apple.com/library/iOS/#documentation/General/Conceptual/Devpedia-CocoaApp/KVO.html

15
Jake

いくつかの簡単なデータバインディング機能を提供する小さなオープンソースライブラリを作成しました。これは基本的に、Key-Value監視(KVO)のラッパーにすぎません。

GitHubには他にも同様のライブラリがいくつかあります。

15

おそらく、Githubの Reactive Cocoa 、値のシーケンスを作成および変換するためのフレームワーク、.NETのObjective-Cバージョン Reactive Extensions(Rx) についても言及する必要があります。

バインディングの仕組みは(サンプルから)非常に簡単に実行できます。

// RACObserve(self, username) creates a new RACSignal that sends a new value
// whenever the username changes. -subscribeNext: will execute the block
// whenever the signal sends a value.
[RACObserve(self, username) subscribeNext:^(NSString *newName) {
    NSLog(@"%@", newName);
}];
12
Roman B.

NSFetchedResultsControllerを忘れないでください。

本格的なデータバインドコントローラーではありませんが、テーブルビューをCoreDataではるかに使いやすくします。

3
Abizern

Swiftを使用している場合は、Bondフレームワークを確認してください: https://github.com/ReactiveKit/Bond

バインドは次のように簡単です。

textField.reactive.text.bind(to: label.reactive.text)

それは機能的にうまく機能します:

textField.reactive.text
  .map { "Hi " + $0 }
  .bind(to: label.reactive.text)

そして、簡単な観察を提供します:

textField.reactive.text
  .observeNext { text in
    print(text)
  }
3
Srđan

STV( http://sensiblecocoa.com )は、テーブルビュー内でそれを実行できるフレームワークです。

2
brainray

TableViewControllersには、スタンフォード大学のCoreDataTableViewControllerを使用しています。 TableViewControllerに通常実装する多くの詳細を非表示にします。

CoreDataTableViewController.hと.mをグーグルで検索すると、外出先で役立ちます。利用可能ないくつかのコースのバージョンがありますが、最新のものはARCを使用し、古いものは使用しません。

NSManagedObjectを使用してラベルと編集フィールドを同期するために、私はまだ良い解決策を探しています。

1
Bjinse

はい、Interface Builderにうまく統合され、最小限のコードオーバーヘッドしか必要としないデータバインディングフレームワークがあります(あるとしても)。

見てください https://github.com/mutech/aka-ios-beacon

編集:たとえば、Interface Builderでテーブルビューのデータソースバインディングプロパティを次のように設定するだけで、フェッチされた結果コントローラーにテーブルビューをバインドできます。

[ yourResultsController ] { defaultCellMapping: "YourCellId" }

そして、あなたがしなければならない唯一のことは、ビューコントローラでプロパティyourResultsControllerを定義することです。

wiki は、かなり完全なドキュメントと多くのユースケースの例を提供します。

0
Michael