显示不带 segue 的弹出框 -- 弹出框仍处于全屏状态

Presenting a popover without segue -- Popover is still full screen

提问人:AMichael 提问时间:1/18/2020 更新时间:1/18/2020 访问量:971

问:

我有一个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函数应该可以防止这种情况,但没有运气。我知道使用 segue 可以使它正常工作,但我无法在故事板中制作 segue,因为我的按钮是以编程方式制作的。

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

iOS Swift 弹出窗口 UIPopoverPresentationController

评论


答:

0赞 Paulw11 1/18/2020 #1

在访问该属性之前,您需要将 设置为:modalPresentationStyle.popoverpopoverPresentAtionController

文档中

如果创建了视图控制器,但尚未显示它,则当 modalPresentationStyle 属性中的值为 UIModalPresentationStyle.popover 时,访问此属性将创建一个弹出框表示控制器。如果模式表示样式是其他值,则此属性为 nil。

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

此外,还可以将 segue 与在代码中创建的按钮一起使用,方法是在按钮操作处理程序代码中使用。performSegue