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

标签 ios objective-c ipad uipopovercontroller state-restoration

在我已经实现的一个应用程序中 state restoration目前正在开发 iPad 版本。在 iPad 版本中,我使用 UIPopoverController 来显示 View Controller ,但我无法找出应如何保存和恢复这些弹出窗口 Controller 。

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

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

法本

最佳答案

假设您有一个属性 popoverControllerRestorationDictionary 用于存储有关当前呈现的弹出窗口 Controller 的附加信息,以下是如何恢复弹出窗口 Controller 的想法:

- (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 - 如何使用 iOS 状态恢复来恢复 UIPopoverController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18398243/

相关文章:

ios - 重复本地通知 iOS 10

objective-c - 在类上调用静态方法

iphone - 如何播放文件名模糊的文件?

iphone - NSArray enumerateObjectsUsingBlock : delay enumeration

ios - 如果对象无效,如何检查 Swift?

ios - cocos2d : running different actions on parent and child node

iphone - iPad 中允许的最大缓存

iphone - stringFromDate 总是 NIL

c# - Xamarin iOS - 如何发送电子邮件

ios - 通过 iOS 8 Widget 断开蓝牙设备