Я использую -[WKInterfaceController presentControllerWithNames:contexts:] для модального представления динамически создаваемого набора страниц. Могут быть случаи, когда я хочу вставить страницу в набор страниц, пока они видны. Возможно ли это, или набор страниц фиксируется после того, как виден?

1
mashers 19 Апр 2016 в 11:13

2 ответа

Лучший ответ

Вот решение, которое я придумал для этого.

/*
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
mashers 23 Апр 2016 в 10:09

Я придумал способ добиться этого, но он беспорядочный. Лучшим решением было бы значительное улучшение.

  1. Каждый WKInterfaceController в группе страниц имеет свойство UUID, которое назначается с использованием его контекста и сохраняется во время awakeWithContext:
  2. WKInterfaceController, который представляет группу страниц, сохраняет массивы WKInterfaceController имен и контекстов перед их представлением
  3. Когда на одной из страниц требуется вставить / удалить страницы из набора, она отправляет уведомление обратно в презентацию WKInterfaceController
  4. Представляющий WKInterfaceController вносит необходимые изменения в свои сохраненные массивы имен и контекстов WKInterfaceController.
  5. Представление WKInterfaceController отклоняет текущую группу страниц, а затем повторно представляет их, используя обновленные массивы имени / контекста.
  6. Представление WKInterfaceController отправляет уведомление, которое наблюдается на всех страницах, включая UUID для новой страницы в качестве объекта уведомления. Уведомление заставляет страницы сверять свой собственный UUID с тем, который был отправлен в объекте уведомления. Если уведомление совпадает, то контроллер интерфейса вызывает becomeCurrentPage

Я на самом деле не тестировал это, но это единственный способ, который, как мне кажется, мог бы сработать. Это было бы некрасиво, поскольку вы бы увидели, что текущая страница исчезает, затем появляется первая страница, а затем новая страница анимируется в поле зрения. Не очень хорошо с точки зрения пользовательского опыта, но я не могу придумать другого способа, поскольку Apple не предоставляет нам никаких методов для вставки страниц.

0
mashers 21 Апр 2016 в 10:59