【问题标题】:How to use dismiss an iPhone popover in a Storyboard如何在情节提要中使用关闭 iPhone 弹出框
【发布时间】:2016-03-19 01:12:40
【问题描述】:

我想使用 Travis M. 提供的解决方案来解决这个问题: How to use dismiss an iPhone popover in an Adaptive Storyboard

但是,我需要将以下内容翻译为目标 c。

有人可以帮忙吗?


如果您想要的是 iPad 上的弹出框,但 iPhone 上带有关闭按钮的模态表,那么您无需在情节提要中为弹出框创建额外的导航控制器即可。

在 Xcode 6.3 故事板中,您只需连接一个视图控制器并将 segue 指定为“Present as 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
    }
}

然后添加委托扩展(在视图控制器的代码下方)并动态创建导航控制器/关闭按钮:

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
    }
}

然后你添加你的解雇功能,你应该很高兴:

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

【问题讨论】:

    标签: ios objective-c swift popover


    【解决方案1】:

    它与objective-c 没有什么不同。您可能仅通过查看就可以弄清楚发生了什么。它只是为 segue 做准备并实现协议的一部分。

    myViewController 需要声明自己符合 UIAdaptivePresentationControllerDelegate。然后就是代码了。

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
            if ([[segue identifier] isEqualToString:@"myPopoverSegueName"]) {
                UIViewController *viewController = segue.destinationViewController;
                viewController.popoverPresentationController.delegate = self
            }
        }
    
    - (UIViewController *)presentationController:(UIPresentationController *)controller
      viewControllerForAdaptivePresentationStyle:(UIModalPresentationStyle)style
    {
                UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismiss)];
                UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller.presentedViewController];
               navController.topViewController.navigationItem.leftBarButtonItem = doneButton;
    
    }
    
    -(void) dismiss
    {
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    您无需使用扩展程序或类别。不会保证这是否符合 Travis M. 所说的那样。

    【讨论】:

    • 该解决方案似乎有效,谢谢。我收到一条警告说“从不兼容的类型 'BVBSettings *const __strong' 分配给 'id _Nullable' BVBSettings 是在 viewController.popoverPresentationController.delegate = self; 行显示弹出控制器的 viewController 的名称
    • 声明 BVBSettings 符合 UIPopoverPresentationControllerDelegate 协议
    猜你喜欢
    • 2012-01-07
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    相关资源
    最近更新 更多