UITableViewCell事件中的UITableView丢失

时间:2015-11-06 08:42:10

标签: c# ios uitableview xamarin.ios tableviewcell

我已经实现了一个UITableView,其中包含一个内置UITableViewCell的自定义UITableView,我能够正确绑定所有数据,但我缺少的是事件没有被解雇我的内心UITableViews

基本上

outer UITableView
----custom cell
---- ---- ----inner UITableView #1
---- ---- ---- ----custom cell with two rows, row#1 with labels
---- ---- ---- ----custom cell with two rows, row#2 with swipe gesture
----custom cell
---- ---- ----inner UITableView #2
---- ---- ---- ----custom cell with two rows, row#1 with labels
---- ---- ---- ----custom cell with two rows, row#2 with swipe gesture
----custom cell
---- ---- ----inner UITableView #3
---- ---- ---- ----custom cell with two rows, row#1 with labels
---- ---- ---- ----custom cell with two rows, row#2 with swipe gesture

等...

内部UITableView内的滑动手势未被触发,实际上没有触发任何事件。我已经尝试重写触摸事件,但它们没有被击中。我尝试了很多无用的事情,包括调用NextResponder触摸事件。

包含外部UITableView的视图是可滚动的,也许这与它有关?

我想要实现的是只有#2行被刷过而不是整个内部UITableView(从外部UITableView完成时它起作用但是因为两行#1都没有要求并且#2轻扫)但由于事件没有传递下来,我无法让它发挥作用。

我错过了什么?

这就是我在外部UITableView自定义单元格中定义内部UITableView的方法:

public PlanningGwWrapperCell(IntPtr handle) : base(handle)
{
    _playersTable = new PlanningPlayersTableView();
    _playersTableSource = new MvxPlanningGwPlayersTableViewSource(_playersTable);

    _layout = CreateLayout();

    _playersTable.Source = _playersTableSource;
    _playersTable.Delegate = new PlanningGwPlayersTableDelegate();

    ContentView.AddSubview(new UILayoutHost(_layout));

    InitializeBindings();

    _playersTable.ReloadData();
}

_layout是一个LinearLayout(XibFree)。

UITableView就是这样:

class PlanningPlayersTableView : UITableView
{
    public PlanningPlayersTableView()
    {
        PrepareTable();
    }

    void PrepareTable()
    {
        SeparatorStyle = UITableViewCellSeparatorStyle.None;
        RowHeight = Dimens.TableRowHeight;
        ScrollEnabled = false;
        BackgroundColor = Colors.AppBackground;
    }
}

表格来源是:

public class MvxPlanningGwPlayersTableViewSource : BaseMvxTableViewSource<PlanningGwPlayersCell>
{
    public MvxPlanningGwPlayersTableViewSource(UITableView tableView)
        : base(tableView)
    {
    }

    public override nint RowsInSection(UITableView tableview, nint section)
    {
        return 1;
    }

    public override nint NumberOfSections(UITableView tableView)
    {
        return 1;
    }

    public override bool CanEditRow(UITableView tableView, NSIndexPath indexPath)
    {
        var source = (MvxPlanningGwPlayersTableViewSource)tableView.Source;
        var itemsSource = (source).ItemsSource;

        if (itemsSource == null) return false;

        var row = ((ObservableCollection<PlanningGWItemsViewModel>)itemsSource)[indexPath.Row];

        return row.CanAdd || row.CanRemove;
    }

    public override void CommitEditingStyle(UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
    {
        switch (editingStyle)
        {
            case UITableViewCellEditingStyle.None:
                break;
        }
    }

    public override UITableViewCellEditingStyle EditingStyleForRow(UITableView tableView, NSIndexPath indexPath)
    {
        return UITableViewCellEditingStyle.Delete;
    }

    protected override UITableViewCell GetOrCreateCellFor(UITableView tableView, NSIndexPath indexPath, object item)
    {
        return (PlanningGwPlayersCell)tableView.DequeueReusableCell(PlanningGwPlayersCell.Id);
    }
}

关于如何传递事件的任何线索?外表是否只响应滚动事件,而所有其他事件都由内表处理?

更新
原来问题与以下几行有关:

ContentView.AddSubview(new UILayoutHost(_layout));

UILayoutHost吞下事件,如果我将表直接放在子视图中,事件就会被保留。

1 个答案:

答案 0 :(得分:0)

答案确实是从UILayoutHost拆分标题行(第一行)和滑动行(第二行):

public PlanningGwWrapperCell(IntPtr handle)
        : base(handle)
    {
        ...

        ContentView.AddSubview(new UILayoutHost(_header));
        ContentView.AddSubview(_playersTable);

        InitializeBindings();

        _playersTable.ReloadData();
    }

    public override void LayoutSubviews()
    {
        base.LayoutSubviews();

        _playersTable.Frame = new CGRect(0, Dimens.TableRowHeight, ContentView.Bounds.Width, Dimens.TableRowHeight);
        _header.LayoutParameters = new LayoutParameters(ContentView.Bounds.Width, Dimens.TableRowHeight);
    }