如何使用 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
,因此没有我可以使用的 restorationIdentifier
和 restorationClass
属性。
我是否负责在我的主视图控制器中保存弹出框控制器的 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?的主要内容,如果未能解决你的问题,请参考以下文章