Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios8 如何在自适应故事板中使用iPhone popover_Ios8_Uistoryboard_Uistoryboardsegue - Fatal编程技术网

Ios8 如何在自适应故事板中使用iPhone popover

Ios8 如何在自适应故事板中使用iPhone popover,ios8,uistoryboard,uistoryboardsegue,Ios8,Uistoryboard,Uistoryboardsegue,我是iOS开发新手,正在尝试同时学习故事板、Swift和iOS 8的新功能 我创建了一个非常简单的故事板,它使用Popover演示序列来显示另一个视图。在模拟器上,如果我在iPad上运行这个程序,它会正常工作。但是,如果我在iPhone上运行它,而不是在popover上运行,它会在原始视图的顶部显示一个全屏视图。这很好;但是,没有办法关闭它并返回到原始屏幕 我观看了WWDC 2014视频“228 A Look inside presentation Controller”,如果他们完全用代码构建

我是iOS开发新手,正在尝试同时学习故事板、Swift和iOS 8的新功能

我创建了一个非常简单的故事板,它使用Popover演示序列来显示另一个视图。在模拟器上,如果我在iPad上运行这个程序,它会正常工作。但是,如果我在iPhone上运行它,而不是在popover上运行,它会在原始视图的顶部显示一个全屏视图。这很好;但是,没有办法关闭它并返回到原始屏幕

我观看了WWDC 2014视频“228 A Look inside presentation Controller”,如果他们完全用代码构建用户界面,他们可以显示一个关闭按钮


我还观看了“411 interface builder中的新功能”课程,他们说这可以在interface builder中完成,但他们没有展示,承诺如果有人感兴趣,将在实验室展示如何完成。不幸的是,我没有参加2014年WWDC,也不知道有谁参加过。我的谷歌搜索也没有返回任何有用的信息。

您可以像这样添加导航控制器-

  • 将popover视图控制器设置为导航控制器的根视图控制器
  • 删除当前正在使用的popover segue
  • 从显示popover的按钮将segue重新连接到导航控制器。 在iPad上你会得到一个popover,在iPhone上你会得到一个模态演示。iPad和iPhone都将显示导航控制器。根据您的用例,这可能是您想要的,也可能不是。下面是故事板的屏幕显示。
如果您真的希望视图控制器始终是一个popover,请保持故事板的原样,并将类似这样的内容添加到显示popover的视图控制器中-

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Your segue name"]) {
    UIViewController *yourViewController =  segue.destinationViewController;
    yourViewController.modalPresentationStyle = UIModalPresentationPopover;
    UIPopoverPresentationController *popoverPresentationController = yourViewController.popoverPresentationController;
    popoverPresentationController.delegate = self;
   }
}
显示popover的视图控制器还需要响应此
UIPopopOverpresentationDelegate
方法

- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller 
{
return UIModalPresentationNone;//always popover.
}
最后,您可以执行以下操作,只将导航控制器添加到iPhone上视图控制器的模式显示中,而将iPad上的popover保留在没有导航控制器的情况下

  • 让你的故事板保持原样
  • 插入导航控制器的正确位置位于
    -(UIViewController*)表示控制器:(UIPresentationController*)控制器viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)样式中
    。为了调用它,我们必须将自己设置为
    UIPopoverPresentationController
    的代理。 我们将再次在
    prepareforsgue:

    -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
    if ([segue.identifier isEqualToString:@"Your segue name"]) {
        UIViewController *yourViewController =  segue.destinationViewController;
        yourViewController.modalPresentationStyle = UIModalPresentationPopover;
        UIPopoverPresentationController *popoverPresentationController = yourViewController.popoverPresentationController;
        popoverPresentationController.delegate = self;
        }
    }
    
然后我们将在我上面提到的委托方法中执行此操作

-(UIViewController *)presentationController:(UIPresentationController *)controller viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style
{
    UIViewController *presentedViewController = controller.presentedViewController;
    UINavigationController *navigationController = [[UINavigationController alloc]
                 initWithRootViewController:presentedViewController];
    UIBarButtonItem *dismissButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonItemStyleDone target:self action:@selector(done:)];
    presentedViewController.navigationItem.rightBarButtonItem = dismissButton;

    return navigationController;
}

祝你好运

如果你想要的是iPad上的一个popover,但iPhone上有一个带有关闭按钮的模式表,那么你可以在故事板上为popover创建一个额外的导航控制器

在Xcode 6.3情节提要中,您只需连接一个视图控制器并将segue指定为“Present as Popover”

下面的代码应该位于连接到popover的视图控制器中,而不是popover本身中:

首先设置popover委托:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "myPopoverSegueName") {
        let vc = segue.destinationViewController
        vc.popoverPresentationController?.delegate = self
        return
    }
}
然后添加代理扩展(在视图控制器代码下方),并动态创建导航控制器/关闭按钮:

extension myViewController: UIPopoverPresentationControllerDelegate {

    func presentationController(controller: UIPresentationController, viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController? {
        let btnDone = UIBarButtonItem(title: "Done", style: .Done, target: self, action: "dismiss")
        let nav = UINavigationController(rootViewController: controller.presentedViewController)
        nav.topViewController.navigationItem.leftBarButtonItem = btnDone
        return nav
    }

}
然后,您添加了Disclose函数,您应该可以开始了:

func dismiss() {
    self.dismissViewControllerAnimated(true, completion: nil)
}

我不知道为什么需要为“完成”按钮设置故事板,所有的工作都可以通过编程完成,只需几行代码。重要的部分是实现一些
UIAdaptivePresentationControllerDelegate
协议方法,如下所示:

 func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle
 {
       return .FullScreen
 }
 func presentationController(controller: UIPresentationController,
        viewControllerForAdaptivePresentationStyle style: UIModalPresentationStyle) -> UIViewController?{

      var navController:UINavigationController = UINavigationController(rootViewController: controller.presentedViewController)
      controller.presentedViewController.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action:"done")
      return navController       
}
然后,一个简单的方法来实现popover在全屏显示时的解除行为:

func done (){        
      presentedViewController?.dismissViewControllerAnimated(true, completion: nil)
}

你完成了

在将逻辑放入情节提要的同时,可以使用最简单的代码。在显示popover的视图控制器中,只需输入marker方法

@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {

}
它不需要任何代码,但需要存在,以便您可以在以后使用interface builder时控制拖动到退出图标

我的popover内容没有占据整个背景视图,但有一个小的空白。这意味着您可以使用interface builder为此视图创建轻触手势识别器。控件将手势识别器拖动到退出图标,然后弹出一些退出选项,其中一个是如上所示的unwindToContainerVC方法

现在,只要点击边缘(例如在iPhone4S场景中),您就会返回到显示视图控制器

以下是手势识别器的连接检查器:

在我的例子中,我有一个小的弹出窗口,我想在iPhone和iPad上都成为一个弹出窗口,并且希望避免使用带有“关闭”的导航栏。发现需要实现两个代理调用(Swift 3.0):


你在故事板上有任何UINavigationController吗?@adityawirayuda:我没有,但如果需要,可以添加一个。请尝试一下,我相信它会在导航堆栈中添加演示视图控制器(因此演示视图控制器上的“后退”按钮)@adityawirayuda:不幸的是,它不起作用。在显示popover的情况下,如何使“完成”按钮不显示?
-(void)prepareforsgue:(UIStoryboardSegue*)segue sender:(id)sender{if([segue.identifier IsequalString:@“页面大小popover”]){UINavigationController*navController=segue.destinationViewController;UIModalPresentationStyle=navController.modalPresentationStyle;if(style==UIModalPresentationPageSheet){uibarbuttoneim*doneButton=[[uibarbuttoneim alloc]initWithBarButtonSystemItem:UIBarButtonItemStyleDone目标:自我操作:@selector(done:)];[navController。
extension MyViewController : UIPopoverPresentationControllerDelegate {
    // Needed for iPhone popup
    func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
    }

    // Needed for iPhone in landscape
    func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }
}