永远不会调用重写的DialogViewController方法?
作者:互联网
这是我的第一个问题,对不起,我深表歉意.
我是使用Xamarin和iOS开发的新手.我有一个DialogViewController的自定义实现,以便可以重写UITableViewController上的某些方法.出于问题的考虑,这是一个非常基本的实现.
public class CustomDialogViewController : DialogViewController
{
public CustomDialogViewController(RootElement root)
: base (root)
{ }
public override NSIndexPath WillSelectRow(UITableView tableView, NSIndexPath indexPath)
{
return base.WillSelectRow(tableView, indexPath);
}
public override NSIndexPath WillDeselectRow(UITableView tableView, NSIndexPath indexPath)
{
return base.WillDeselectRow(tableView, indexPath);
}
public override void RowSelected(UITableView tableView, NSIndexPath indexPath)
{
base.RowSelected(tableView, indexPath);
}
}
我这样创建实例:
var rootElement = new RootElement("Main");
_mainSection = new Section();
rootElement.Add(_mainSection);
dvcProductGroupList = new CustomDialogViewController(rootElement);
dvcProductGroupList.Style = UITableViewStyle.Plain;
dvcProductGroupList.TableView.Frame = new RectangleF(...);
dvcProductGroupList.View.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;
dvcProductGroupList.OnSelection += dvcProductGroupList_OnSelection;
然后,将DialogViewController添加到视图中.我在每个替代的开始处都设置了断点,但是它们从未被击中.在创建时,没有任何元素,但是当视图加载时,它将使用一些数据(4个字符串元素)填充对话框视图控制器.对于尝试使用MonoTouch对话框对行选择进行更多控制的任何协助,我将非常感谢.我试图获得取消行更改的效果,以使其在单击时不会选择另一行,而且我认为这是正确的方法,我只是不明白为什么它们从未被击中,我觉得这是一种真的很简单的问题.
谢谢.
解决方法:
我不确定我是否以正确的方式进行处理,但是我确实从某个人那里得到了关于我的问题的答案,因为我遇到了被覆盖的方法未调用的确切问题,因此如果有人有相同的问题,我将发布他们的答案问题.感谢Xamarin论坛中的JonathanBird.
您试图在错误的类中覆盖这些方法. DialogViewController使用UITableViewSource对象构建UITableView.我的理解是,当使用UiTableViewSource配置UITableViewController时,不会调用UITableViewController中的方法.由于DialogViewController是UITableViewController的子类,因此它也适用于它.
DialogViewController使用子类型DialogViewController.Source的UITableViewSource对象.如果要覆盖有问题的方法,则需要子类DialogViewController.Source并在那里重写方法.
最后,您需要将DialogViewController创建的DialogViewController.Source替换为您创建的DialogViewController.Source.您可以通过在CustomDialogViewController中重写CreateSizingSource()来实现此目的.
DialogViewController使用CreateSizingSouce()的以下实现.
public virtual DialogViewController.Source CreateSizingSource (bool unevenRows)
{
return (!unevenRows) ? new DialogViewController.Source (this) : new DialogViewController.SizingSource (this);
}
如果您的实现不使用不均匀的行,那么您只需要担心返回一种类型的Source.
例如,CustomDialogViewController中的替代可能是:
public override Source CreateSizingSource (bool unevenRows)
{
return new CustomSource(this);
}
其中CustomSource是DialogViewController.Source的子类,该子类将覆盖所需的方法.
以下是您的实现可能采用的多种可能形式之一,其中显示了对RowSelected方法的覆盖.
public class CustomDialogViewController : DialogViewController
{
public CustomDialogViewController (RootElement root) : base (root) {}
public override Source CreateSizingSource (bool unevenRows)
{
return new CustomSource(this);
}
private class CustomSource : DialogViewController.Source
{
public CustomSource (CustomDialogViewController controller) : base (controller)
{}
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
// You handle row selected here
base.RowSelected (tableView, indexPath);
}
}
}
标签:monotouch-dialog,xamarin-ios,c 来源: https://codeday.me/bug/20191122/2057468.html