在ios5.0和ios5.1之间的splitview poperver问题

时间:2012-08-25 16:17:24

标签: ios ios5 uisplitviewcontroller

我已经研究过几乎所有关于此事的帖子,并且已经达到了我可以使用帮助的程度。

我的项目是使用故事板构建的通用应用程序。 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];
  • 第二个问题是为什么popover会更改为幻灯片,并且您可以在iOS 5.1中将其更改回来。我实际上喜欢我的应用程序在iOS 5.0中的弹出效果,但我无法更改幻灯片以使用popover。我已经尝试了很多方法来改变多个位置的弹出窗口的内容大小,但它似乎对拆分视图弹出窗口没有影响,而类似的代码在其他misc上工作正常。按钮弹出窗口。

我一定错过了这个,但我假设苹果是故意这样做的,但必须有一种方法可以覆盖?

注意:找到一个解决方案或至少一种在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];     }

现在,你有两个。

1 个答案:

答案 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]; }