【问题标题】:Xamarin.iOS UIPopoverPresentationController ExceptionXamarin.iOS UIPopoverPresentationController 异常
【发布时间】:2018-04-19 21:44:53
【问题描述】:

我在使用 UIPopoverPresentationController 呈现 Popover 时遇到了困难,我可以从 Internet 上找到,包括 thisthis。没有任何帮助。这是我创建的一个测试应用:

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 应该有一个非零的 sourceView 或 barButtonItem 在演示发生之前设置。

【问题讨论】:

    标签: ios xamarin xamarin.ios popover


    【解决方案1】:

    每个UIViewController 都有一个名为UIPopoverPresentationControllerPopoverPresentationController,您可以使用它来展示您的弹出视图:

    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时,它会返回null。所以这里我建议你每次显示的时候在你的方法中初始化它。

    另外如果你想在iPhone上实现同样的效果,请加UIPopoverPresentationControllerDelegatelike:

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

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

    【讨论】:

    • 这里的关键是初始化UIViewController.PopoverPresentationController而不是创建一个新实例。谢谢
    • 在每次“点击”时创建视图可以防止在多次显示弹出框时出现异常。再次感谢
    • 很高兴它帮助了你。
    【解决方案2】:

    您需要将UIPopoverPresentationController.SourceView 设置为视图控制器之外的UIView,以提供成为锚点的视图,即 视图控制器上的UIView

    您说通过按钮触摸呈现此内容,您可以将该按钮用作源(如果该位置合适)。

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

    示例:

    【讨论】:

    • 您好,感谢您的回复。我一定是误解了一些东西——我的代码中的View 是顶级视图,而不是应用程序Window 大概。我的button 不起作用,因为它已添加并包含在View 中。
    • 你指的是this.ParentViewController吗?这里是空的。
    猜你喜欢
    • 2019-02-12
    • 2016-12-02
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多