2

在我的一个应用程序中,我实现了状态恢复,目前正在开发 iPad 版本。在我UIPopoverController用于显示视图控制器的 iPad 版本中,但我无法找出应该如何保存和恢复这些弹出框控制器。

UIPopoverController不继承自UIViewController,因此没有我可以使用的属性restorationIdentifierrestorationClass

我是否负责在我的主视图控制器中手动保存弹出控制器targetRect并对其进行编码,contentViewController以便我可以在其方法期间恢复它,-decodeRestorableStateWithCoder:或者是否有一种我在文档中找不到的更简单的方法?

法班

4

1 回答 1

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];
    }
}

这个解决方案充其量是次优的,所以如果有人想出更好的方法,请告诉我!

于 2013-08-25T08:16:14.703 回答