2015-09-28 76 views
37

我使用这个代码代码如何解决UIPopoverController不推荐使用的警告消息?

mediaLibraryPopover = [[UIPopoverController alloc] 
         initWithContentViewController:avc]; 
[self.mediaLibraryPopover presentPopoverFromRect:[theButton bounds] 
          inView:theButton 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
          animated:YES]; 

而且我得到在Xcode-7这样的警告。

UIPopoverController is deprecated ,first deprecated in iOS 9.0 - UIPopoverController is deprecated. Popovers are now implemented as UIViewController presentations. Use a modal presentation style of UIM 
+3

如果我知道如何删除警告,那么我没有问过问这个问题。而且当你也不知道如何删除警告时,你评论道。 –

+0

UIStorybaordPopoverSegue.h中的弃用警告已得到改进,现在提供了方向:“从您的segue的performHandler中访问destinationViewController.popoverPresentationController ...” – Mark

回答

91

您不再需要UIPopoverController来呈现视图控制器。 相反,您可以将视图控制器的modalPresentationStyle设置为UIModalPresentationPopover

您可以使用下面的代码为:

avc.modalPresentationStyle = UIModalPresentationPopover; 
avc.popoverPresentationController.sourceView = theButton; 
[self presentViewController:avc animated:YES completion:nil]; 

UIModalPresentationPopover

在一个水平定期的环境,其中内容显示在酥料饼视图 的演讲风格。 背景内容变暗,并在弹出窗口外点击,导致弹出窗口被取消。如果您不想点击以关闭弹出窗口,则可以将一个或多个视图分配给相关UIPopoverPresentationController对象的透视视图 属性,您可以从popoverPresentationController属性中获取该属性,其中包含 。

在水平紧凑环境中,此选项的行为与 UIModalPresentationFullScreen相同。

适用于iOS 8.0或更高版本。

参考UIModalPresentationStyle Reference


您需要设置任何sourceViewbarButtonItem财产,否则它会与下面的消息崩溃:

***终止应用程序由于未捕获的异常' NSGenericException',原因:'UIPopoverPresentationController(***)在演示发生之前应该有一个非零 sourceView或barButtonItem。

要正确定位弹出箭头,还需要指定sourceRect属性。

avc.modalPresentationStyle     = UIModalPresentationPopover; 
avc.popoverPresentationController.sourceView = self.view; 
avc.popoverPresentationController.sourceRect = theButton.frame; 
[self presentViewController:avc animated:YES completion:nil]; 

参考sourceViewsourceRect的更多细节。

+4

我发现我需要更改'avc.popoverPresentationController.sourceView = self.view; '并且添加'avc.popoverPresentationController.sourceRect = theButton.frame;'让弹窗被正确定位。 – mark

+0

@mark有一个好点,但我不认为你需要改变sourceView。当我这样做时,我离开了'avc.popoverPresentationController.sourceView = theButton;'原样并简单地添加了'avc.popoverPresentationController.sourceRect = theButton。' – Alex311

+1

@downvoter:你能告诉我为什么你投了票,这样我就可以改进我的答案。 –

-5

编辑:关于反对票。首先一个有趣和相关的故事:

http://www.folklore.org/StoryView.py?story=Negative_2000_Lines_Of_Code.txt

我下面贴,以帮助程序员可能一直停留在心态,呈现媒体选择器UI时的iPad/iPhone仍然需要独立的执行路径的答案。在我原来的帖子时,这在其他答案中还不清楚。此解决方案路径简化了我的代码以及我的应用程序的未来维护。我认为其他人可能会认为这种观点很有用,因为有时删除正确的代码行可能是一个很好的解决方案。

编辑结束。

如果你已经有一个工作程序,只是想摆脱折旧的警告这可能适合你。

在我的代码和我的理解中,Popovers是为iPad引入的,并且是iPad专用的。苹果似乎改变了这一点。所以,如果你已经有使用这样的一个工作程序:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    // use popovers 
else 
    // don't use popovers 

你可以做的是刚刚摆脱了iPad专用代码(这可能是使用Popovers的代码),并让你的程序运行iPhone和iPad的相同说明。这对我有效。

+5

答案没有用:不言而喻,删除导致不需要警告的代码将删除警告。 – ToolmakerSteve

+0

但是,你不再需要特殊的代码来处理iPad上的图像选择器,这就是我试图做的。 –

+0

此外,您的答案意味着删除代码仍然会在iPad上提供弹出功能,但情况并非如此。它只是完全放弃了popover支持,这是一个重要的iPad用户界面功能。 – Markus

1

如果直接从按键操作则可以使用此代码

SecondViewController *destinationViewController = (SecondViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"second"]; 
destinationViewController.modalPresentationStyle = UIModalPresentationPopover; 
destinationViewController.popoverPresentationController.sourceView = self.customButton; 

// Set the correct sourceRect given the sender's bounds 
destinationViewController.popoverPresentationController.sourceRect = ((UIView *)sender).bounds; 
[self presentViewController:destinationViewController animated:YES completion:nil]; 
4

苹果已经提出和iOS8上这里配置popovers官方途径希望:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverPresentationController_class/index.html

虽然类似@ MidhunMP的答案,这是值得一提的段落:

配置酥料饼的演示控制器调用 presentViewController:animated:completion:可能会看到后, m 违反直觉,但直到您启动演示文稿之后,UIKit才会创建演示文稿控制器 。此外,UIKit必须等待 ,直到下一个更新周期才能在屏幕上显示新内容。 延迟时间让您有时间为您的弹出窗口配置演示控制器 。

如果您想要(https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverPresentationControllerDelegate_protocol/index.html),配置和响应事件也可以通过委托完成。

一个例子,撇开使用委托的:

// Present the controller using the popover style. 
controller.modalPresentationStyle = UIModalPresentationPopover; 
[self presentViewController:controller animated:YES completion:nil]; 

// Popover presentation controller was created when presenting; now configure it. 
UIPopoverPresentationController *presentationController = 
     [controller popoverPresentationController]; 
presentationController.permittedArrowDirections = UIPopoverArrowDirectionLeft; 
presentationController.sourceView = containerFrameOfReferenceView; 
// arrow points out of the rect specified here 
presentationController.sourceRect = childOfContainerView.frame; 

但你也想放弃。要做到这一点,而无需使用委托,您呈现控制器可以叫:

[self dismissViewControllerAnimated:YES completion:nil]; 

但如果我转动我的设备,并且酥料饼不指向正确的区域?您的提供控制器可以处理它:

// Respond to rotations or split screen changes 
- (void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; 
    [coordinator animateAlongsideTransition:nil 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) { 
     // Fix up popover placement if necessary, after the transition. 
     if (self.presentedViewController) { 
      UIPopoverPresentationController *presentationController = 
        [self.presentedViewController popoverPresentationController]; 
      presentationController.sourceView = containerFrameOfReferenceView; 
      presentationController.sourceRect = childOfContainerView.frame; 
     } 
    }]; 
} 
相关问题