2

ユーザーが 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 アプリを開発できます。

ご指摘ありがとうございます。本当に単純な詳細が欠けているだけだと確信していますが、それが何であるかわかりません..

4

1 に答える 1