0

我有一个 UIViewController,里面有一个我以编程方式制作的按钮(我们就叫它 MyViewController)。我试图在点击按钮时显示一个弹出框。让我们调用弹出框 DestinationViewController。点击该按钮将调用以下函数:

func buttonAction(_ button: UIView) {
   var popover = storyboard?.instantiateViewController(withIdentifier: "destinationVC") as? DestinationViewController
   popover?.popoverPresentationController?.delegate = self
   popover?.modalPresentationStyle = .popover
   popover?.popoverPresentationController?.sourceView = button
   //popover?.popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: 50, height: 50)
   popover?.preferredContentSize = CGSize(width: 200, height: 100)

   present(popover!, animated: true, completion: nil)         
}

(我注释掉了 sourceRect 行,因为它什么也没做,但我不知道我是不是用错了。)

此外,我确保 MyViewController 符合 UIPopoverPresentationControllerDelegate 协议。所以 MyViewController 实现了功能:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
   return .none
}

最后,在我的 DestinationViewController 故事板中,我选中了“使用首选显式大小”框,宽度为 200,高度为 100。

但是,我的 DestinationViewController 仍然全屏显示。我已经读到adaptivePresentationStyle 函数应该防止这种情况,但没有运气。我知道使用转场会使其正常工作,但我无法在情节提要中进行转场,因为我的按钮是以编程方式制作的。

关于我应该做些什么来解决这个问题的任何想法?我对制作popovers不太熟悉,所以我需要一些帮助。

4

1 回答 1

0

您需要在访问该属性之前modalPresentationStyle将其设置为:.popover popoverPresentAtionController

文档中

如果您创建了视图控制器但尚未呈现它,当 modalPresentationStyle 属性中的值为 UIModalPresentationStyle.popover 时,访问此属性会创建一个弹出呈现控制器。如果模态表示样式是不同的值,则此属性为 nil。

由于您在设置委托之前尚未设置模态演示样式,因此不会创建弹出演示控制器。设置 时将创建弹出框控制器.sourceView,因为现在是演示样式,.popover但不会在此实例上设置委托。

performSegue此外,您可以通过在按钮操作处理程序代码中使用您在代码中创建的按钮来使用 segue 。

于 2020-01-17T23:29:40.317 回答