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
1
A
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.
- Chaque
WKInterfaceController
dans le groupe de pages a une propriétéUUID
qui est attribuée à l'aide de son contexte et stocké pendantawakeWithContext:
- Le
WKInterfaceController
qui présente le groupe de pages conserve les tableaux deWKInterfaceController
noms et contextes avant de les présenter - Lorsque l'une des pages doit insérer/supprimer des pages de l'ensemble, il renvoie une notification à la présentation
WKInterfaceController
- La présentation
WKInterfaceController
effectue les modifications requises dans ses tableaux conservés deWKInterfaceController
noms et contextes - La présentation
WKInterfaceController
rejette le groupe actuel de pages, puis les re-présente à l'aide des tableaux nom/contexte mis à jour - La présentation
WKInterfaceController
affiche une notification qui est observée par toutes les pages, y compris leUUID
pour la nouvelle page en tant qu'objet de notification. La notification déclenche les pages pour vérifier leur propreUUID
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.