使用Miguel de Icaza的Patterns for Creating UITableViewCells,我创建了一个自定义的UITableViewCell并将其转换为MonoTouch.Dialog元素。我正在使用元素API来创建一个编辑表单,使用我的一些自定义元素。
我正在试图弄清楚如何回应元素的删除。我的自定义元素引用了它在数据库中表示的记录。我想以与响应Selected事件相同的方式响应已删除的事件,其中我获得了DialogViewController,UITableView和NSIndexPath。假设我可以响应的Element存在这样的事件,我会使用给定的记录id向数据库发出一个delete语句。
答案 0 :(得分:4)
根据Miguel的回答,我在子类Element中添加了一个名为MyDataElement的公共Delete方法。
public class MyDataElement : Element {
static NSString key = new NSString ("myDataElement");
public MyData MyData;
public MyDataElement (MyData myData) : base (null)
{
MyData = myData;
}
public override UITableViewCell GetCell (UITableView tv)
{
var cell = tv.DequeueReusableCell (key) as MyDataCell;
if (cell == null)
cell = new MyDataCell (MyData, key);
else
cell.UpdateCell (MyData);
return cell;
}
public void Delete() {
Console.WriteLine(String.Format("Deleting record {0}", MyData.Id));
}
}
然后在我的子类DialogViewController上,我处理CommitEditingStyle方法,将元素转换为MyDataElement,然后调用Delete方法:
public class EntityEditingSource : DialogViewController.Source {
public EntityEditingSource(DialogViewController dvc) : base (dvc) {}
public override bool CanEditRow (UITableView tableView, NSIndexPath indexPath)
{
// Trivial implementation: we let all rows be editable, regardless of section or row
return true;
}
public override UITableViewCellEditingStyle EditingStyleForRow (UITableView tableView, NSIndexPath indexPath)
{
// trivial implementation: show a delete button always
return UITableViewCellEditingStyle.Delete;
}
public override void CommitEditingStyle (UITableView tableView, UITableViewCellEditingStyle editingStyle, NSIndexPath indexPath)
{
// In this method, we need to actually carry out the request
var section = Container.Root [indexPath.Section];
var element = section [indexPath.Row];
//Call the delete method on MyDataElement
(element as MyDataElement).Delete();
section.Remove (element);
}
}
答案 1 :(得分:3)
您必须修改源以处理Source类中的delete事件,并将该消息分派给Element,其方式与对其他事件的处理方式相同。