问题描述
我需要 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。