我正在使用此代码:
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的模态表示样式。
答案 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
您需要设置UIModalPresentationPopover
或avc.modalPresentationStyle = UIModalPresentationPopover;
avc.popoverPresentationController.sourceView = theButton;
[self presentViewController:avc animated:YES completion:nil];
属性,否则会因以下消息而崩溃:
***由于未捕获的异常'NSGenericException'终止应用程序,原因:'UIPopoverPresentationController(***)应该有一个非零 在演示文稿发生之前设置了sourceView或barButtonItem。'
要正确锚定弹出箭头,您还需要指定sourceView
属性。
barButtonItem
有关详细信息,请参阅sourceView和sourceRect。
答案 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指令。这对我有用。