Search code examples
c#iosxamarinuimenucontrolleruimenuitem

Why isn't my UIMenuController shown in my view?


I can't figure out why my UIMenuController doesn't show up in my view. When I long-press the button, I can see that all instructions are executed, but menu is not shown.

public class MySingleArticleView : UIView
{
    private MyArticleViewController _controller; // MyArticleViewController extends BaseViewController

    public MySingleArticleView (MyArticleViewController controller, ...)
    {
        _controller = controller;

        // ... init code
    }

    void ArticleLongPressed (UILongPressGestureRecognizer gestureRecognizer)
    {
        var menuController = UIMenuController.SharedMenuController;
        var copyMenuItem = new UIMenuItem ("copy", new Selector ("CopyRow"));
        var pasteMenuItem = new UIMenuItem ("paste", new Selector ("PasteRow"));
        var location = gestureRecognizer.LocationInView (_controller.View);
        _controller.BecomeFirstResponder ();
        menuController.MenuItems = new [] { copyMenuItem, pasteMenuItem };
        menuController.SetTargetRect (new CGRect (location.X, location.Y, 0, 0), _controller.View);
        menuController.SetMenuVisible (true, true);
    }

    [Export("CopyRow")]
    void Row (UIMenuController controller)
    {
        // do something
    }

    [Export("PasteRow")]
    void PasteRow (UIMenuController controller)
    {
        // do something
    }
}

What am I forgetting?


Solution

  • I found the answer by myself and maybe someone else can have the same problem.

    I needed to put colon ':' after the exported function name, so:

    [Export("PasteRow:")] 
    void PasteRow (UIMenuController controller) 
    { 
    
    }
    
    [Export("CopyRow:")] 
    void CopyRow (UIMenuController controller) 
    { 
    
    }
    

    Similarly, when instatiating:

    var copyMenuItem = new UIMenuItem ("copy", new Selector ("CopyRow:")); 
    var pasteMenuItem = new UIMenuItem ("paste", new Selector ("PasteRow:"));