我已经研究过几乎所有关于此事的帖子,并且已经达到了我可以使用帮助的程度。
我的项目是使用故事板构建的通用应用程序。 iPad版本使用分割视图控制器。 Master view relatioship是一个带视图控制器的导航控制器。详细信息视图是具有视图控制器的导航控制器。
没有意识到我使用iPad 5.1模拟器构建并测试了应用程序。在意识到小细节并需要iOS 5.0兼容性后,我开始在ios 5.0中进行测试。
发生了两个大的变化:a)拆分视图显示在popover中,而不是像5.1.1中的全屏(我更喜欢popover)和b)我的代码以编程方式隐藏并显示popover / splitscreen完美无瑕的5.1在5.0中不起作用 - “show”实际上崩溃了应用程序。我构建了一些方法来显示/隐藏弹出框以补充UI,而不仅仅依赖于方向更改。例如,我使用show方法将popover以纵向方式放在屏幕上,但在选择tableview之后将其删除等。
所以,也许有人可以提供帮助。以下是详细信息和问题 - 非常感谢您的帮助:
iOS 5.1 - show pop up - 我使用splitview控制器委托调用来获取对弹出按钮的引用,然后使用按钮操作显示方法中的弹出窗口。这在5.1中完美无缺,但在5.0中引起了这个错误:错误:弹出窗口无法从没有窗口的视图中呈现。 (我已经搜索了这个错误,但有许多引用,但没有针对我的配置的具体答案)。另外,为什么5.1中有一个窗口而不是5.0?
//show master view popover
[self.masterPopoverController presentPopoverFromBarButtonItem:self.showMasterViewButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
//get the reference from the button
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController
{
self.showMasterViewButton = [[UIBarButtonItem alloc]initWithTitle:nil style:UIBarButtonItemStyleDone target:barButtonItem.target action:barButtonItem.action];
}
这里首先观察到按钮实际上在5.0和5.1中均可用,并且在导航栏上显示和工作。但是,在代码中引用相同的按钮会导致5.0崩溃并在5.1上运行。我不知道为什么。
将其隐藏在ios 5.0中的相同问题。 在iOS 5.1中使用这种方法:
if (self.masterPopoverController) {
[self.masterPopoverController dismissPopoverAnimated:YES];
}
self.masterPopoverController设置在上面列出的相同splitview委托回调中。 这在iOS 5.1中完美无缺,但在iOS 5.0中无效。
注意 - 更新:我在这里找到了一个答案来解决我列出的第一个问题:https://github.com/mattgemmell/MGSplitViewController/pull/31 解决我列出的第一个问题。
//grab a reference to the popover controller in the split view delegate call
//splitview ... willHideViewController
self.masterPopoverController = popoverController;
//then add the following to a method and call it when you need it
//this fixes the no window issue in iOS 5.0
[self.masterPopoverController presentPopoverFromRect:CGRectZero inView:[[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
我一定错过了这个,但我假设苹果是故意这样做的,但必须有一种方法可以覆盖?
注意:找到一个解决方案或至少一种在ios5.1上模拟ios5.0行为的方法
创建一个属性来保存UIViewController,另一个属性来保存UIPopoverController
然后在拆分视图中委托回调获取主视图控制器的副本
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController {
self.copyOfMasterViewController = viewController;
}
然后像这样在项目中添加一个方法:
-(void)showsPopover {
self.ios51popover = [[UIPopoverController alloc]initWithContentViewController:self.masterViewInPopover];
[self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
[self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
- (void)hidesPopover { [self.ios51popover dismissPopoverAnimated:YES]; }
现在,你有两个。
答案 0 :(得分:0)
这个第一个片段展示了如何在ios5.0和5.1中以编程方式显示分割视图中的弹出窗口,并修复了没有窗口的视图无法显示弹出窗口。 注意 - 更新:我在这里找到了一个答案来解决我列出的第一个问题:https://github.com/mattgemmell/MGSplitViewController/pull/31来解决我列出的第一个问题。
//在拆分视图委托调用中获取对弹出控制器的引用 // splitview ... willHideViewController
self.masterPopoverController = popoverController;
//然后将以下内容添加到方法中,并在需要时调用它 //这解决了iOS 5.0中的无窗口问题 [self.masterPopoverController presentPopoverFromRect:CGRectZero inView:[[UIApplication sharedApplication] keyWindow] allowedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
下一个片段展示了如何在ios5.0样式中呈现真正的popover,而不是苹果在iOS 5.1中实现的幻灯片
注意:更新:找到一个解决方案或至少一种在ios5.1上模拟ios5.0行为的方法 创建一个属性来保存UIViewController,另一个属性来保存UIPopoverController
然后在拆分视图中委托回调获取主视图控制器的副本
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController {
self.copyOfMasterViewController = viewController;
}
然后像这样在项目中添加一个方法:
-(void)showsPopover {
self.ios51popover = [[UIPopoverController alloc]initWithContentViewController:self.copyOfMasterViewController];
[self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
[self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
-(void)hidesPopover { [self.ios51popover dismissPopoverAnimated:YES]; }