如何在Xamarin.Forms上处理iOS上的配件按钮?

时间:2016-09-08 17:49:45

标签: c# ios xamarin xamarin.forms custom-renderer

要在表格视图委托中覆盖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;
    }
}

2 个答案:

答案 0 :(得分:1)

我认为,您只需在渲染器中实现方法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
    }
}

答案 1 :(得分:1)

除了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();
    }
}

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

另一个带有地图控件的示例可以找到here