2

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

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

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

Fabain

ответ

2

Учитывая, что у вас есть свойство 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]; 
    } 
} 

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