在UITableViewSource中没有调用RowSelected

时间:2013-11-29 07:42:30

标签: ios objective-c uitableview xamarin.ios xamarin

我一直在尝试通过组合多个UITableView来实现多列表视图。

我遇到的一个问题是,当我在多列视图中的某个TableView上选择一行时,我无法调用RowSelected的覆盖。

在模拟器中运行时,它会在单击时突出显示一行,因此单击行的功能正常,但不会调用覆盖。

以下是UITableViewSource的代码。在那下面是设置多列视图的代码。

非常感谢任何帮助。

public class TableSource : UITableViewSource 
{
    protected List<object> _tableItems;
    protected string cellIdentifier = "TableCell";
    private string _propertyName;
    public TableSource (List<object> items, string propertyName)
    {
        _tableItems = items;
        _propertyName = propertyName;
    }
    public override int RowsInSection (UITableView tableview, int section)
    {
        return _tableItems.Count;
    }
    public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {
        // request a recycled cell to save memory
        UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
        // if there are no cells to reuse, create a new one
        if (cell == null)
            cell = new UITableViewCell (UITableViewCellStyle.Default, cellIdentifier);
        PropertyInfo property = _tableItems [indexPath.Row].GetType ().GetProperty (_propertyName);
        cell.TextLabel.Text = property.GetValue(_tableItems[indexPath.Row]).ToString();
        cell.UserInteractionEnabled = true;
        return cell;
    }

    public override UIView GetViewForHeader (UITableView tableView, int section)
    {
        // NOTE: Don't call the base implementation on a Model class
        // see http://docs.xamarin.com/guides/ios/application_fundamentals/delegates,_protocols,_and_events
        throw new NotImplementedException ();
    }

    public override void RowDeselected (UITableView tableView, NSIndexPath indexPath)
    {
        // NOTE: Don't call the base implementation on a Model class
        // see http://docs.xamarin.com/guides/ios/application_fundamentals/delegates,_protocols,_and_events
        throw new NotImplementedException ();
    }

    public override void RowHighlighted (UITableView tableView, NSIndexPath rowIndexPath)
    {
        // NOTE: Don't call the base implementation on a Model class
        // see http://docs.xamarin.com/guides/ios/application_fundamentals/delegates,_protocols,_and_events
        throw new NotImplementedException ();
    }
    public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
    {
        new UIAlertView("Row Selected", "", null, "OK", null).Show();
        tableView.DeselectRow (indexPath, true);
    }
}






[Register("MultiColumnTableView")]
public class MultiColumnTableView: UIView
{
    List<SingleColumnView> _tableViews;
    IEnumerable<object> _dataSource;
    SingleColumnView scrollingTable = null;
    int _nextColumnX;

    public MultiColumnTableView(){
    }
    public MultiColumnTableView (IntPtr handle):base(handle)
    {

    }

    public IEnumerable<object> DataSource
    {
        get 
        {
            return _dataSource;
        }
        set 
        {
            _dataSource = value;
        }
    }

    public void AddColumn(string columnName, string propertyName, int width)
    {
        if(_tableViews== null)
            _tableViews = new List<SingleColumnView>();
        var newColumn = new SingleColumnView (columnName, propertyName, _dataSource, width, _nextColumnX);
        this.AddSubview (newColumn);
        _tableViews.Add (newColumn);
        _nextColumnX += (width);
        newColumn.Scrolled += Scrolled;
        foreach(var table in _tableViews)
        {
            table.ShowsVerticalScrollIndicator = false;
        }
        _tableViews.Last ().ShowsVerticalScrollIndicator = true;
    }

    public void AddColumn(string columnName, string[] propertyNames, string format)
    {
        if(_tableViews== null)
            _tableViews = new List<SingleColumnView>();
        var column = new SingleColumnView (columnName, propertyNames, format, _dataSource);
        _tableViews.Add (column);
        column.Scrolled += Scrolled;
        foreach(var table in _tableViews)
        {
            table.ShowsVerticalScrollIndicator = false;
            table.AllowsSelection = true;
        }
        _tableViews.Last ().ShowsVerticalScrollIndicator = true;
    }

    private void Scrolled (object sender, EventArgs args) 
    {
        if (scrollingTable == null) {
            scrollingTable = sender as SingleColumnView;
        }
        if(scrollingTable != _tableViews.Last())
            _tableViews.Last().FlashScrollIndicators();
        foreach (var table in _tableViews) {
            if (table != sender) {
                table.ContentOffset = (sender as SingleColumnView).ContentOffset;
            }
        }
        scrollingTable = null;
    }
}

public class SingleColumnView: UITableView
{
    public IEnumerable<object> _dataSource;
    public string _propertyName;
    public string[] _propertyNames;
    public string _format;
    public string _columnName;

    public SingleColumnView(string columnName, string propertyName, IEnumerable<object> dataSource, int width, int offsetX):base(new RectangleF(offsetX,0,width,500))
    {
        _columnName = columnName;
        _propertyName = propertyName;
        _dataSource = dataSource;
        this.Source = new TableSource (dataSource.ToList(), propertyName);
        //this.BackgroundColor = new UIColor(new MonoTouch.CoreGraphics.CGColor(255,0,0));
        //this.SeparatorStyle = UITableViewCellSeparatorStyle.None;
        this.SeparatorInset = UIEdgeInsets.Zero;
    }

    public SingleColumnView(string columnName, string[] propertyNames, string format, IEnumerable<object> dataSource):base()
    {
        _columnName = columnName;
        _propertyNames = propertyNames;
        _format = format;
        _dataSource = dataSource;
    }
}

1 个答案:

答案 0 :(得分:2)

您是如何实现自定义UITableViewDelegate的?我建议使用Monotouch的UITableViewSource,因为它将UITableViewDataSource和UITableViewDelegate结合到一个文件中,使事情变得更加容易。

来源:more details

添加到您的项目

我认为您应该尝试使用WeakDelegate来完成这项工作。