我已经研究了几乎所有我能找到的关于这方面的帖子,并且已经到了可以使用一些帮助的地步。
我的项目是使用故事板构建的通用应用程序。iPad 版本使用拆分视图控制器。主视图关系是带有视图控制器的导航控制器。详细视图是带有视图控制器的导航控制器。
在不知不觉中,我使用 iPad 5.1 模拟器构建并测试了该应用程序。在意识到这个小细节并需要 iOS 5.0 兼容性后,我开始在 ios 5.0 中进行测试。
发生了两个重大变化:a)拆分视图显示在弹出窗口中,而不是像 5.1.1 中那样全屏显示(实际上我更喜欢弹出窗口)和 b)我的代码以编程方式隐藏和显示在 5.1 中完美运行的弹出窗口/拆分屏幕在 5.0 中不起作用 - “显示”实际上会使应用程序崩溃。我构建了几种方法来显示/隐藏弹出框以补充 UI,而不仅仅是依赖于方向更改。例如,我使用 show 方法将弹出框纵向放置在屏幕上,但在选择 tableview 后将其移除等。
所以,也许有人可以帮忙。以下是详细信息和问题 - 非常感谢您的帮助:
iOS 5.1 - 显示弹出窗口 - 我使用 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];
- 第二个问题是为什么弹出框会变成滑入式,你能在 iOS 5.1 中把它改回来吗?实际上,我喜欢 iOS 5.0 中的弹出框效果,但我无法将幻灯片更改为使用弹出框。我尝试了许多方法来在多个地方更改弹出框的内容大小,但它似乎对拆分视图弹出框没有影响,而类似的代码在其他杂项上也能正常工作。按钮弹出窗口。
我一定错过了这个,但我假设苹果是故意这样做的,但必须有一种方法可以覆盖?
注意:找到了一种解决方案或至少一种在 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]; }
现在,你拥有两者。