我已经实现了一个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吞下事件,如果我将表直接放在子视图中,事件就会被保留。
答案 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);
}