2015-11-06 58 views
0

我已經實現了一個UITableView,其中包含一個內部爲UITableView的自定義UITableViewCell,我能夠正確綁定所有數據,但是我錯過的是未在我的內部激發的事件UITableViewsUITableView在UITableViewCell事件中丟失

基本上是:

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刷卡的要求),但由於事件不會傳遞下去,我無法讓它工作。

我錯過了什麼?

這是我的限定內UITableViewUITableView定製細胞內:

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); 
    } 
} 

那麼如何傳承的事件任何線索?外部表可以只響應滾動事件,而所有其他事件由內部表處理嗎?

UPDATE
原來,問題有以下行做:

ContentView.AddSubview(new UILayoutHost(_layout)); 

的UILayoutHost正在吞噬的事件,如果我把表裏面直接作爲一個子視圖,事件被存管。

回答

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); 
    }