如何使用 iOS 状态恢复来恢复 UIPopoverController?

Posted

技术标签:

【中文标题】如何使用 iOS 状态恢复来恢复 UIPopoverController?【英文标题】:How to restore UIPopoverController with iOS State Restoration? 【发布时间】:2013-08-23 08:27:45 【问题描述】:

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

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

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

法班

【问题讨论】:

【参考方案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];
    

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

【讨论】:

以上是关于如何使用 iOS 状态恢复来恢复 UIPopoverController?的主要内容,如果未能解决你的问题,请参考以下文章

iOS SDK - 使用 UIImagePickerController 时如何恢复状态栏?

如何使用状态恢复来恢复视图控制器的子视图

iOS 可达性和应用挂起/恢复行为

iOS 14 中的状态恢复

iOS 中使用 MMDrawer 的状态保存和恢复问题

iOS - 状态恢复 - 获取以前恢复的视图控制器