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

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

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

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

法班

【问题讨论】:

    标签: ios objective-c ipad uipopovercontroller state-restoration


    【解决方案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];
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-10-25
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 2013-01-13
      • 2017-03-05
      • 1970-01-01
      相关资源
      最近更新 更多