当用户触摸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应用程序。
提前感谢任何指针。我确信我只是错过了一些非常简单的细节,但我无法弄清楚它是什么......
答案 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 !!!