Как восстановить UIPopoverController с помощью восстановления состояния iOS?

В одном из моих приложений я реализовал восстановление состояния и сейчас работаю над версией для iPad. В версии для iPad я использую UIPopoverController для отображения контроллеров представления, но я не могу понять, как эти контроллеры всплывающих окон должны быть сохранены и восстановлены.

UIPopoverController не наследуется от UIViewController и, следовательно, не имеет свойств restorationIdentifier и restorationClass, которые я мог бы использовать.

Несу ли я ответственность за сохранение targetRect контроллера popover и кодирование его contentViewController вручную в моем контроллере основного представления, чтобы я мог восстановить его во время его метода -decodeRestorableStateWithCoder:, или есть более простой способ, который я просто не смог найти в документации?

Фабен


person Fabian Kreiser    schedule 23.08.2013    source источник


Ответы (1)


Учитывая, что у вас есть свойство popoverControllerRestorationDictionary для хранения дополнительной информации о представленном в данный момент контроллере всплывающих окон, вот идея того, как вы можете восстановить контроллеры всплывающих окон:

- (void)presentPopoverController:(UIPopoverController *)popoverController fromRect:(CGRect)rect animated:(BOOL)animated
{
    [popoverController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:animated];

    self.popoverControllerRestorationDictionary = @{ @"popoverController" : popoverController, @"rect" : [NSValue valueWithCGRect:rect] };
}

- (void)dismissedPresentedPopoverController
{
    self.popoverControllerRestorationDictionary = nil;
}

- (void)encodeRestorableStateWithCoder:(NSCoder *)coder
{
    ...

    if (self.popoverControllerRestorationDictionary != nil) {
        [coder encodeBool:YES forKey:@"restorePopoverController"];

        UIPopoverController *popoverController = [self.popoverControllerRestorationDictionary objectForKey:@"popoverController"];
        [coder encodeObject:popoverController.childViewController forKey:@"popoverController.childViewController"];

        NSValue *rectValue = [self.popoverControllerRestorationDictionary objectForKey:@"rect"];
        [coder encodeObject:rectValue forKey:@"popoverController.targetRect"];
    }
}

- (void)decodeRestorableStateWithCoder:(NSCoder *)coder
{
    ...

    if ([coder decodeObjectForKey:@"restorePopoverController"]) {
        UIViewController *childViewController = [coder decodeObjectForKey:@"popoverController.childViewController"];
        CGRect targetRect = [[coder decodeObjectForKey:@"popoverController.targetRect"] CGRectValue];

        UIPopoverController *popoverController = [[UIPopoverController alloc] initWithChildViewController:childViewController];

        [self presentPopoverController:popoverController fromRect:targetRect animated:NO];
    }
}

Это решение в лучшем случае неоптимально, поэтому, если кто-то придумает что-то лучшее, сообщите мне!

person Fabian Kreiser    schedule 25.08.2013