使用Xamarin在iOS中的UITableView中不调用RowSelected

时间:2013-08-06 17:18:06

标签: ios uitableview selection xamarin mouseclick-event

当用户触摸UITableView中的行时,我正在尝试做某事。我正在编写iOS并使用Xamarin。

我假设当用户触摸UITableView中的一行时,该行被突出显示,这意味着用户刚刚选择了一行。所以,我认为在UITableViewSource中覆盖RowSelected方法是有意义的。但是出于某些原因,我似乎无法让这种方法被调用。

这是我完整的UITableViewSource实现:

public class DeviceSource : UITableViewSource
{
    public event EventHandler<FoundDevice> DeviceSelected;
    private List<FoundDeviceWithInfo> Devices { get; set; }

    public DeviceSource(List<FoundDeviceWithInfo> devices)
    {
        Devices = new List<FoundDeviceWithInfo>(devices);
    }

    public override int RowsInSection(UITableView tableview, int section)
    {
        return Devices.Count;
    }

    public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
    {
        base.RowSelected(tableView, indexPath);

        if (DeviceSelected != null)
        {
            DeviceSelected(tableView, Devices[indexPath.Row].FoundDevice);
        }
    }

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell((NSString)indexPath.Row.ToString());

        if (cell == null)
        {
            cell = new DeviceCell(Devices[indexPath.Row].FoundDevice.IpAddress + ":" + Devices[indexPath.Row].FoundDevice.PortNumber,
                              Devices[indexPath.Row].FoundDevice.DeviceName,
                              Devices[indexPath.Row].DeviceCommonInfo != null ? Devices[indexPath.Row].DeviceCommonInfo.Position.AutoGEOTag.Lat : string.Empty,
                              Devices[indexPath.Row].DeviceCommonInfo != null ? Devices[indexPath.Row].DeviceCommonInfo.Position.AutoGEOTag.Long : string.Empty,
                              (NSString)indexPath.Row.ToString()) {UserInteractionEnabled = true};
        }

        return cell;
    }

    public void AddDevice(FoundDeviceWithInfo device)
    {
        if (!Devices.Contains(device))
        {
            Devices.Add(device);
        }
    }

    public void RemoveDevice(FoundDeviceWithInfo device)
    {
        if (Devices.Contains(device))
        {
            Devices.Remove(device);
        }
    }

    public void ClearAllDevices()
    {
        Devices.Clear();
    }
}

这是我创建表视图并将其分配给我的DeviceSource的地方:

    _tableView = new UITableView
    {
        ScrollEnabled = true,
        Frame = new RectangleF(10, 74, View.Bounds.Width - 20, View.Bounds.Height - 84),
        AutoresizingMask = UIViewAutoresizing.All,
        Source = new DeviceSource(new List<FoundDeviceWithInfo>()),
        RowHeight = 45
    };

    ((DeviceSource)_tableView.Source).DeviceSelected += DeviceViewController_DeviceSelected;

以下是用户选择列表中的项目时应该处理的方法:

void DeviceViewController_DeviceSelected(object sender, ClientCommunication.AutoDiscovery.FoundDevice dev)
{
    UpnpController.GetInfo(dev);
}

当我触摸UITableView中的项目时,不会调用上述方法。我在这里错过了什么?我是否误解了iOS中“选定”的概念?我对iOS开发完全不熟悉并使用Xamarin,因此我可以使用C#开发iOS应用程序。

提前感谢任何指针。我确信我只是错过了一些非常简单的细节,但我无法弄清楚它是什么......

1 个答案:

答案 0 :(得分:0)

谢谢你啊!

你钉了它。我在调用基类,我不应该:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    base.RowSelected(tableView, indexPath);

    if (DeviceSelected != null)
    {
        DeviceSelected(tableView, Devices[indexPath.Row].FoundDevice);
    }
}

只需删除对base.RowSelected(..)的调用:

public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
    if (DeviceSelected != null)
    {
        DeviceSelected(tableView, Devices[indexPath.Row].FoundDevice);
    }
}

现在它运作得很好。

谢谢JASON !!!