我如何修复" UIPopoverController已被弃用"警告?

时间:2015-09-28 08:05:15

标签: ios objective-c uipopovercontroller deprecated

我正在使用此代码:

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

我在Xcode 7中收到此警告:

  

不推荐使用UIPopoverController,在iOS 9.0中首先弃用 - 不推荐使用UIPopoverController。弹出窗口现在实现为UIViewController演示。使用UIModalPresentationPopover和UIPopoverPresentationController的模态表示样式。

4 个答案:

答案 0 :(得分:105)

您不再需要package com.example.anand.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import com.wordnik.swagger.annotations.Api; import com.wordnik.swagger.annotations.ApiOperation; @Api(value = "main controller", description = "Endpoint for TEST Managemenent") @Controller @RequestMapping("/newfinalmvc") public class HomeController { @RequestMapping(value = "/addnew", method = RequestMethod.POST) @ApiOperation(value = "Addnew ", notes = "Add new Controller") public @ResponseBody Object addNew(@RequestBody hello hel) { String getName = hel.getName(); System.out.println(getName); hello h1 = new hello(); h1.setName(getName); return h1; } } 来呈现视图控制器。 相反,您可以将视图控制器的public class hello { String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 设置为UIPopoverController

您可以使用以下代码:

modalPresentationStyle
  

<强> UIModalPresentationPopover

     

在水平常规环境中,a   在弹出视图中显示内容的演示文稿样式。   背景内容变暗,并在弹出窗口之外进行点击   要被解雇的人员。如果你不想让水龙头解雇   popover,您可以为passthroughViews分配一个或多个视图   关联的UIPopoverPresentationController对象的属性,   你可以从popoverPresentationController属性获得。

     

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

     

适用于iOS 8.0及更高版本。

参考UIModalPresentationStyle Reference

您需要设置UIModalPresentationPopoveravc.modalPresentationStyle = UIModalPresentationPopover; avc.popoverPresentationController.sourceView = theButton; [self presentViewController:avc animated:YES completion:nil]; 属性,否则会因以下消息而崩溃:

  

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

要正确锚定弹出箭头,您还需要指定sourceView属性。

barButtonItem

有关详细信息,请参阅sourceViewsourceRect

答案 1 :(得分:6)

Apple有官方方式在这里展示和配置iOS8的弹出窗口:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIPopoverPresentationController_class/index.html

虽然类似于@ MidhunMP的答案,但值得注意的是段落:

  

调用后配置弹出窗口控制器   distinct可能看起来像   反直觉,但UIKit不会创建演示控制器   直到你发起演讲。另外,UIKit必须等待   直到下一个更新周期,无论如何都要在屏幕上显示新内容。   延迟使您有时间配置演示控制器   你的popover。

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

一个例子,不使用委托:

presentViewController:animated:completion:

但你也想解雇这个。要在不使用代理的情况下执行此操作,您的演示控制器只需拨打:

// 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];

答案 2 :(得分:1)

如果需要直接来自Button Action,则可以使用此代码

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];

答案 3 :(得分:-6)

编辑:关于下选票。首先是一个有趣且相关的故事:

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

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

编辑结束。

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

在我的代码中,据我所知,Popovers是针对iPad推出的,并且是针对iPad的。 Apple似乎改变了这一点。所以,如果你已经有一个使用这样的工作程序:

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

你可以做的就是摆脱iPad特定的代码(可能是使用Popovers的代码),让你的程序运行相同的iPhone和iPad指令。这对我有用。