Xamarin.iOS UIPopoverPresentationController 异常

Xamarin.iOS UIPopoverPresentationController Exception

我在使用 UIPopoverPresentationController 显示 Popover 时遇到困难,这是我从互联网上找到的内容,包括 this and 。没有任何帮助。这是我创建的测试应用程序:

ViewController.cs

  public override void ViewDidLoad()
  {
     ...

     var popupView = new UIImageView(new CGRect(0, 0, 200, 200))
     {
        Image = UIImage.FromBundle("Menu")
     };

     _menuController = new UIViewController
     {
        ModalPresentationStyle = UIModalPresentationStyle.Popover,
        View = popupView
     };

     _presentationController = new UIPopoverPresentationController(_menuController, this)
     {
        SourceView = View,
        SourceRect = new CGRect(50, 50, 300, 300),
     };
  }

我在按下按钮时调用:

  PresentViewController(_menuController, true, null);

当呈现样式为 Popover:

时出现此异常

UIPopoverPresentationController should have a non-nil sourceView or barButtonItem set before the presentation occurs.

您需要将 UIPopoverPresentationController.SourceView 设置为视图控制器外部的 UIView 以提供成为锚点的视图,即 parent[ 上的 UIView =23=] 视图控制器

你说通过触摸按钮呈现这个,你可以使用那个按钮作为来源(如果那个位置合适的话)。

_presentationController = new UIPopoverPresentationController(_menuController, this)
{
    SourceView = button,
    SourceRect = new CGRect(50, 50, 300, 300),
};

示例:

每个 UIViewController 都有一个名为 PopoverPresentationControllerUIPopoverPresentationController,您可以用它来展示您的流行观点:

private void OnMenuSelected(object sender, EventArgs eventArgs)
{
    var popupView = new UIImageView(new CGRect(0, 0, 200, 200))
    {
        Image = UIImage.FromBundle("Menu"),
        UserInteractionEnabled = true
    };

    _menuController = new UIViewController
    {
        ModalPresentationStyle = UIModalPresentationStyle.Popover,
        PreferredContentSize = new CGSize(200, 200),
        View = popupView
    };

    _menuController.PopoverPresentationController.SourceRect = new CGRect(50, 50, 300, 300);
    _menuController.PopoverPresentationController.SourceView = View;


    PresentViewController(_menuController, true, null);
}

我发现当我们关闭 popoverview 时,它会 return 为 null。所以这里我建议大家在每次出现的时候都在自己的方法中进行初始化

此外,如果你想在iPhone上实现同样的效果,请添加UIPopoverPresentationControllerDelegate like:

public override UIModalPresentationStyle GetAdaptivePresentationStyle(UIPresentationController forPresentationController)
{
    return UIModalPresentationStyle.None;
}

为其设置委托:_menuController.PopoverPresentationController.Delegate = new MyPopOverViewDelegate();