Xamarin 中 UITableViewCell 中的选择器

问题描述

我需要 UIMenuItem调用 UITableViewCell 中的方法。如此处所述:https://stackoverflow.com/a/31358474/202179 .

目前,如果我向方法添加 UIViewController 属性,我只能从 UIMenuItem 调用 Export 内的方法

这个方法在单元格中的导出有一些技巧,但是我到现在都没找到。我希望这段代码可以工作,但它没有:

[Register("CustomCell")]
public class CustomCell : UITableViewCell
{
    public CustomCell(IntPtr intPtr) : base(intPtr)
    {
        var menuItem = new UIMenuItem("Menu Item",new ObjCRuntime.Selector("CustomCell.SeekSelectedText"));
        UIMenuController.SharedMenuController.MenuItems = new UIMenuItem[] { menuItem };
        UIMenuController.SharedMenuController.Update();
    }

    [Export("SeekSelectedText")]
    void SeekSelectedText()
    {
        //do something
    }
}

正如所说,在 UIViewController 中引用一个不同的选择器是可行的,所以问题是无论我怎么尝试,这个选择器似乎都没有被识别。

解决方法

这是我的测试,自定义 UIMenuItem 工作正常。

首先,定义一个继承UITableViewCell

的自定义单元格类
class MyCell: UITableViewCell
{
    public MyCell(UITableViewCellStyle style,string reuseIdentifier):base(style,reuseIdentifier)
    {

    }

    [Export("custom")]
    void Custom()
    {
        //do something
        Console.WriteLine("custom pop up");
    }

    public override bool CanPerform(Selector action,NSObject withSender)
    {
        if (action == new Selector("custom"))
            return true;
        else
            return false;
    }
}

其次,设置你的UITableView的来源

class MyTableViewSource : UITableViewSource
{
    int i = 0;
    // create custom cell
    public override UITableViewCell GetCell(UITableView tableView,NSIndexPath indexPath)
    {
        string cellStr = "cell";
        MyCell cell = (MyCell)tableView.DequeueReusableCell(cellStr);
        if (cell == null)
        {
            cell = new MyCell(UITableViewCellStyle.Subtitle,cellStr);
            cell.TextLabel.Text = $"User Name {i}";
            cell.DetailTextLabel.Text = $"details here... {i++}";
        }
        return cell;
    }
    public override nint RowsInSection(UITableView tableview,nint section)
    {
        return 10;
    }
}

然后覆盖相关方法(例如,ShouldShowMenu、CanPerformAction)。

class MyTableViewDelegate : UITableViewDelegate
{
    public override bool ShouldShowMenu(UITableView tableView,NSIndexPath rowAtindexPath)
    {
        return true;
    }

    public override bool CanPerformAction(UITableView tableView,Selector action,NSIndexPath indexPath,NSObject sender)
    {
        return true;
    }

    public override void PerformAction(UITableView tableView,NSObject sender)
    {

    }

    public override bool ShouldHighlightRow(UITableView tableView,NSIndexPath rowIndexPath)
    {
        return true;
    }
}

最后,不要忘记将自定义 MenuItem 添加到您的 UITableViewCell。

UIMenuController.SharedMenuController.MenuItems = new UIMenuItem[] {
    new UIMenuItem ("Custom",new Selector ("custom"))
};

由于 UICollectionView 和 UITableVIew 有类似的功能,可以直接参考示例SimpleCollectionView