0

我已经研究了几乎所有我能找到的关于这方面的帖子,并且已经到了可以使用一些帮助的地步。

我的项目是使用故事板构建的通用应用程序。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]; }

现在,你拥有两者。

4

1 回答 1

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 样式呈现真正的弹出框,而不是苹果在 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]; }
于 2012-08-25T22:07:19.517 回答