2016-04-19 2 views
1

J'utilise -[WKInterfaceController presentControllerWithNames:contexts:] pour présenter de façon modale un ensemble de pages créé dynamiquement. Il peut y avoir des occasions où je veux insérer une page dans l'ensemble des pages pendant qu'elles sont évidentes. Est-ce possible ou est-ce que l'ensemble des pages est fixé une fois visible?WatchOS: Insertion de pages dans la navigation basée sur des pages

Répondre

0

Voici la solution que j'ai imaginée pour cela.

/* 
MyInterfaceController - class within the set of pages 
*/ 
- (void)awakeWithContext:(id)context { 
    [super awakeWithContext:context]; 
    NSDictionary *dict = (NSDictionary*)context; 
    self.uuid = [dict valueForKey:@"uuid"]; 
    self.jumpuuid = [dict valueForKey:@"jumpuuid"]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkBecomeCurrentPage:) name:@"checkBecomeCurrentPage" object:nil]; 
} 

- (void)checkBecomeCurrentPage:(NSNotification*)notification { 
    NSString *checkUUID = (NSString*)notification.object; 

    if ([self.uuid isEqualToString:checkUUID]) { 
     [self becomeCurrentPage]; 
    } 
} 

- (void)didAppear { 
    [super didAppear]; 

    if (self.jumpuuid) { 
     [[NSNotificationCenter defaultCenter] postNotificationName:@"checkBecomeCurrentPage" object:self.jumpuuid]; 
    } 
} 

- (IBAction)addPageButtonAction { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"addPageNotification" object:self]; 
} 

#warning Populate this with the names and contexts for the set of pages when initially displaying them. It is used for inserting pages later 
+ (NSMutableDictionary*)namesAndContextsForCurrentlyDisplayedPage { 
    static NSMutableDictionary *dict = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     dict = [NSMutableDictionary dictionary]; 
    }); 
    return dict; 
} 

+ (void)addPageWithPresentingController:(WKInterfaceController *)presentingController requestingInterfaceController:(MyInterfaceController *)requestingInterfaceController { 
    NSMutableArray *contexts = [[[MyInterfaceController namesAndContextsForCurrentlyDisplayedPages] objectForKey:@"contexts"] mutableCopy]; 

    NSInteger requestingInterfaceControllerIndex = -1; 

    for (NSDictionary *dict in contexts) { 
     if ([[dict valueForKey:@"uuid"] isEqualToString:requestingInterfaceController.uuid]) { 
      requestingInterfaceControllerIndex = [contexts indexOfObject:dict]; 
     } 
    } 

    if (requestingSetInterfaceControllerIndex == -1) { 
     #warning Display an error that the position of the current page could not be established 
    } 
    else { 
     NSInteger insertIndex = requestingInterfaceControllerIndex + 1; 

     NSMutableArray *names = [[[MyInterfaceController namesAndContextsForCurrentlyDisplayedPages] objectForKey:@"names"] mutableCopy]; 
     [names insertObject:@"MyInterfaceController" atIndex:insertIndex]; 

     NSString *newUUID = [[NSUUID UUID] UUIDString]; 
     NSDictionary *newDict = @{@"uuid": newUUID}; 

     [contexts insertObject:newdict atIndex:insertIndex]; 

     NSMutableDictionary *firstDict = [contexts.firstObject mutableCopy]; 
     [firstDict setValue:newUUID forKey:@"jumpuuid"]; 
     [contexts replaceObjectAtIndex:0 withObject:firstDict]; 

     [[MyInterfaceController namesAndContextsForCurrentlyDisplayedPages] setValue:names forKey:@"names"]; 
     [[MyInterfaceController namesAndContextsForCurrentlyDisplayedPages] setValue:contexts forKey:@"contexts"]; 

     [presentingController dismissController]; 
     [presentingController presentControllerWithNames:names contexts:contexts]; 
    } 
} 

-

/* 
MyParentInterfaceController - the controller which originally presented the set of pages 
*/ 

- (void)awakeWithContext:(id)context { 
    [super awakeWithContext:context]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addPage:) name:@"addPageNotification" object:nil]; 
} 

- (void)addPage:(NSNotification*)notification { 
    [MyInterfaceController addPageWithPresentingController:self requestingInterfaceController:notification.object]; 
} 
0

J'ai conçu une méthode pour y parvenir, mais c'est en désordre. Une meilleure solution serait une amélioration considérable.

  1. Chaque WKInterfaceController dans le groupe de pages a une propriété UUID qui est attribuée à l'aide de son contexte et stocké pendant awakeWithContext:
  2. Le WKInterfaceController qui présente le groupe de pages conserve les tableaux de WKInterfaceController noms et contextes avant de les présenter
  3. Lorsque l'une des pages doit insérer/supprimer des pages de l'ensemble, il renvoie une notification à la présentation WKInterfaceController
  4. La présentation WKInterfaceController effectue les modifications requises dans ses tableaux conservés de WKInterfaceController noms et contextes
  5. La présentation WKInterfaceController rejette le groupe actuel de pages, puis les re-présente à l'aide des tableaux nom/contexte mis à jour
  6. La présentation WKInterfaceController affiche une notification qui est observée par toutes les pages, y compris le UUID pour la nouvelle page en tant qu'objet de notification. La notification déclenche les pages pour vérifier leur propre UUID par rapport à celui envoyé dans l'objet de notification. Si la notification correspond, alors ce contrôleur d'interface appelle

Je n'ai pas réellement testé cela, mais c'est la seule méthode que je peux penser qui pourrait fonctionner. Ce serait moche cependant, comme vous le feriez voir la page actuelle disparaître, puis la première page apparaît, puis la nouvelle page s'anime en vue. Pas génial du point de vue de l'expérience utilisateur, mais je ne vois pas d'autre moyen puisque Apple ne nous donne aucune méthode pour insérer des pages.