1

わかった。私は何かが欠けているに違いない。

2 つの iPad のインターフェイスをミラーリングして、1 人のユーザーが UISwipeGesture を実行して別のビューをプッシュすると、それが他のデバイスにも複製されるようにしようとしています。実際にビューをリアルタイムでプッシュして、アプリの両方のインスタンスに表示したいと考えています。私は Firebase を使用してプロジェクトをレビューし、テストしていますが、これに取り組む方法がわかりません。ただし、Firebase を使用してこれを行うネイティブ iOS アプリを見てきました (javascript の描画例は言うまでもありません)。

誰かが良いコード例を持っているか、正しい方向に向けることができますか?

ありがとう、ダグ

4

1 に答える 1

1

Firebase には、インターフェイス ミラーリングなどのアプリケーション固有の同期を行うための特定のプリミティブはありません。やりたいことは、インターフェイスの現在の状態を JSON として Firebase にモデル化することです。そのため、UI の一部が変更されると、それらを Firebase に保存します。次に、補完もセットアップする必要があります。Firebase からの変更によりイベントが発生した場合は、UI を更新します。ジェスチャやアクションなどにも同じタイプのモデリングが必要です。それらのアイテムを Firebase に保存しておきます (または、それが意味的に簡単に変換できない場合は、アクションの副作用を保持します。たとえば、スワイプによってボタンが位置を移動し、ボタンの位置を Firebase に保存します。)

具体的には、2 つのタブを同期させる例を次に示します。これは、デフォルトの Xcode プロジェクト テンプレート「Tabbled application」に基づいています。その中で、いくつかのことを行います。

  1. タブ項目が変更されたときの KVO オブザーバーを追加する
  2. Firebase からの変更に反応するミラーリングをセットアップする
  3. 実際に UI の新しい状態を Firebase に保存する

#import <Firebase/Firebase.h>

#define kFirebase @"https://mirror.firebaseio-demo.com"

@implementation FAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    UIViewController *viewController1 = [[FFirstViewController alloc] initWithNibName:@"FFirstViewController" bundle:nil];
    UIViewController *viewController2 = [[FSecondViewController alloc] initWithNibName:@"FSecondViewController" bundle:nil];
    self.tabBarController = [[UITabBarController alloc] init];

    // Add KVO observer for when the UI changes so we can eventually synchronize this data to Firebase
    [self.tabBarController.tabBar addObserver:self forKeyPath:@"selectedItem" options:NSKeyValueObservingOptionNew context:nil];
    self.tabBarController.viewControllers = @[viewController1, viewController2];

    // Setup the mirroring of the UI state; when Firebase lets us know the value has been updated, reflect that in the UI
    Firebase* f = [[[Firebase alloc] initWithUrl:kFirebase] childByAppendingPath:@"selectedIndex"];
    [f observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) {
      self.tabBarController.selectedIndex = [snapshot.value intValue];
    }];

    self.window.rootViewController = self.tabBarController;
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    NSUInteger newIndex = [((UITabBar *)object).items indexOfObject:change[NSKeyValueChangeNewKey]];

    // We've been notified via KVO that the UI has changed, so save the new state to Firebase
    [[[[Firebase alloc] initWithUrl:kFirebase] childByAppendingPath:@"selectedIndex"] setValue:[NSNumber numberWithInt:newIndex]];
}


@end

インターフェースのミラーリングに取り組む際に留意すべき点: あるデバイスのユーザーが方向の切り替えを行ったとします。これを Firebase に保存することは容易ですが、ミラーリングされた側でアプリケーション固有の変換を行う必要があります (他のデバイスがデバイスを回転させないことを選択しますか?)。

于 2013-04-10T23:54:27.410 に答える