如何在Xamarin中处理iOS上的附件按钮点击.表格

本文关键字:按钮 表格 Xamarin iOS 处理 | 更新日期: 2023-09-27 18:06:25

在表视图委托中有一个AccessoryButtonTapped方法要重写,但不清楚如何在ListViewRenderer子类中执行?

所以我可以显示一个披露指标,但无法处理点击它

public class ContactCellRenderer : ImageCellRenderer
{
    public override UITableViewCell GetCell (
        Cell item, UITableViewCell reusableCell, UITableView tv)
    {
        var cell = base.GetCell (item, reusableCell, tv);
        cell.Accessory = UITableViewCellAccessory.DetailDisclosureButton;
        return cell;
    }
}

如何在Xamarin中处理iOS上的附件按钮点击.表格

我认为,您只需要在渲染器中实现方法AccessoryButtonTapped

public class ContactListViewRenderer : ListViewRenderer, IUITableViewDelegate
{
    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            Control.WeakDelegate = this; // or. Control.Delegate
        }
    }
    public virtual void AccessoryButtonTapped(UITableView tableView, NSIndexPath indexPath)
    {
        // accessory tapped
    }
}

除了Sven Michael之外,您还可以通过创建ListView的继承(如果您还没有(并向其添加Delegate来丰富他的代码,如下所示:

public class AccessoryListView : ListView
{
   public delegate void OnAccessoryTappedDelegate();
   public OnAccessoryTappedDelegate OnAccessoryTapped { get; set; }
}

现在,从您的自定义渲染器-不要忘记将其设置为新继承的ListView-调用代理

public class ContactListViewRenderer : ListViewRenderer, IUITableViewDelegate
{
    private AccessoryListView _formsControl;
    protected override void OnElementChanged(ElementChangedEventArgs<AccessoryListView> e)
    {
        base.OnElementChanged(e);
        if (Control != null)
        {
            Control.WeakDelegate = this; // or. Control.Delegate
        }
        if (e.NewElement != null)
           _formsControl = e.NewElement;
    }
    public virtual void AccessoryButtonTapped(UITableView tableView, NSIndexPath indexPath)
    {
        // accessory tapped
        if (_formsControl.OnAccessoryTapped != null)
           _formsControl.OnAccessoryTapped();
    }
}

当然,您可以在其中添加一些参数,为共享代码提供更多数据。有了这个,你确实有了一些特定于平台的代码,但你可以"尽快"回到共享代码,使你的代码更加可重用。

这里可以找到另一个带有Map控件的示例。