Многопользовательский интерфейс с WatchConnectivity Context

Я создаю приложение для iPhone (с представлением)/часы (с интерфейсом), которое отображает скорость, расстояние и таймер с функциями «Воспроизведение/Пауза», «Стоп» и «Очистить».

Раньше я делился данными контекста приложения WatchConnectivity между (отправка и получение контекста). Все работает пока что, но я бы добавил еще страницу/интерфейсы на которых обменивается Watch the Context с айфоном а там вообще не знаю как.

Раскадровка моего интерфейса

Если я включу интерфейсы сеанса 2, информация будет потеряна

Вот мой текущий код, я хочу переключить отображение меток TimeLabel, DistanceLabel Label и скорость на втором интерфейсе

//
//  InterfaceController.m
//  Watch Extension
//
//  Created by Arnaud Roy on 25/10/2015.
//  Copyright © 2015 Burotica. All rights reserved.
//

#import "InterfaceController.h"
#import <WatchConnectivity/WatchConnectivity.h>

@interface InterfaceController() <WCSessionDelegate>
    @property (strong, nonatomic) WCSession *session;
    @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceButton *startLabel;
    @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *timeLabel;
    @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *distanceLabel;
    @property (unsafe_unretained, nonatomic) IBOutlet WKInterfaceLabel *vitesseLabel;
    @property (nonatomic,assign) BOOL running;
@end


@implementation InterfaceController

- (void)awakeWithContext:(id)context {
    [super awakeWithContext:context];
    // Configure interface objects here.
}

- (void)willActivate {
    // This method is called when watch view controller is about to be visible to user
    [super willActivate];

    if ([WCSession isSupported]) {
        WCSession *session = [WCSession defaultSession];
        session.delegate = self;
        [session activateSession];
        //NSLog(@"SESSION AVAIBLE");
    }
    //Objective-C
    if ([[WCSession defaultSession] isReachable]) {
        //NSLog(@"SESSION REACHABLE");
    }
    self.running = false;
}

- (void)didDeactivate {
    // This method is called when watch view controller is no longer visible
    [super didDeactivate];
}

- (IBAction)startButton {
    if(self.running == false) {
        [self sendCmd:@"start"];
        [self.startLabel setTitle:[NSString stringWithFormat:@"PAUSE"]];
        self.running = true;
    }
    else
    {
        [self sendCmd:@"pause"];
        [self.startLabel setTitle:[NSString stringWithFormat:@"PLAY"]];
        self.running = false;
    }
}

- (IBAction)clearButton {
   [self sendCmd:@"clear"];
}

- (IBAction)plusmoinsButton {
   [self sendCmd:@"plusmoins"];
}

- (IBAction)stopButton {
    [self sendCmd:@"stop"];
}

-(void)sendCmd:(NSString*) cmdSendW{
    WCSession *session = [WCSession defaultSession];
    NSError *error;
    [session updateApplicationContext:@{@"cmdSendW":cmdSendW} error:&error];
}

- (void)session:(nonnull WCSession *)session didReceiveApplicationContext:(nonnull NSDictionary<NSString *,id> *)applicationContext {
    NSString *cmdSend = [applicationContext objectForKey:@"cmdSend"];
    NSString *timeSend = [applicationContext objectForKey:@"timeSend"];
    NSString *distanceSend = [applicationContext objectForKey:@"distanceSend"];
    NSString *partielSend = [applicationContext objectForKey:@"partielSend"];
    NSString *vitesseSend = [applicationContext objectForKey:@"vitesseSend"];

    dispatch_async(dispatch_get_main_queue(), ^{
        if([cmdSend isEqual: @"start"])
        {
            [self.startLabel setTitle:[NSString stringWithFormat:@"PAUSE"]];
            [self.timeLabel setText:[NSString stringWithFormat:@"Time : %@", timeSend]];
            [self.distanceLabel setText:[NSString stringWithFormat:@"Distance : %@", distanceSend]];
            [self.vitesseLabel setText:[NSString stringWithFormat:@"Vitesse : %@", vitesseSend]];
            self.running = true;
        }
        else if([cmdSend isEqual: @"pause"])
        {
            [self.startLabel setTitle:[NSString stringWithFormat:@"PLAY"]];
            [self.timeLabel setText:[NSString stringWithFormat:@"Time : %@", timeSend]];
            [self.distanceLabel setText:[NSString stringWithFormat:@"Distance : %@", distanceSend]];
            [self.vitesseLabel setText:[NSString stringWithFormat:@"Vitesse : %@", vitesseSend]];
            self.running = false;
        }
        else if([cmdSend isEqual: @"stop"])
        {
            [self.startLabel setTitle:[NSString stringWithFormat:@"PLAY"]];
            [self.timeLabel setText:[NSString stringWithFormat:@"Time : %@", timeSend]];
            [self.distanceLabel setText:[NSString stringWithFormat:@"Distance : %@", distanceSend]];
            [self.vitesseLabel setText:[NSString stringWithFormat:@"Vitesse : %@", vitesseSend]];
            self.running = false;
        }
    });

}

@end

Спасибо за вашу помощь


person Arno.R    schedule 27.10.2015    source источник


Ответы (1)


Я бы предложил, чтобы ваши UIApplicationDelegate и ExtensionDelegate создали экземпляр нового объекта, который вы создаете, который является WCSessionDelegate. Этот объект будет сохранять входящие данные на диск и публиковать уведомления об обновлении резервного хранилища данных. Затем каждый из компонентов пользовательского интерфейса может отслеживать эти уведомления и соответствующим образом обновлять свои пользовательские интерфейсы.

person ccjensen    schedule 27.10.2015