gpt4 book ai didi

c# - 永远不会调用重写的 DialogViewController 方法?

转载 作者:行者123 更新时间:2023-11-30 16:13:33 26 4
gpt4 key购买 nike

这是我的第一个问题,如果不是最好的,我深表歉意。

我刚开始使用 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 添加到 View 中。我在每个覆盖的开始处都设置了断点,但它们从未被击中。在创建时没有元素,但是当加载 View 时,它会用一些数据(4 个字符串元素)填充对话框 View Controller 。如果您尝试使用 MonoTouch 对话框更好地控制行选择,我将不胜感激。我试图获得取消行更改的效果,以便它在单击时不会选择另一行,我认为这些是正确的方法,我只是不明白为什么他们永远不会被击中,我觉得这是一个非常简单的问题。

谢谢。

最佳答案

我不确定我是否以正确的方式处理这个问题,但我确实从某人那里得到了关于我在未调用覆盖方法时遇到的确切问题的答案,所以我会发布他们的答案以防万一有同样的问题。感谢来自 Xamarin 论坛的 JonathanBird。

您正试图在错误的类中覆盖这些方法。 DialogViewController 使用 UITableViewSource 对象构建 UITableView。我的理解是,当使用 UiTableViewSource 来配置 UITableViewController 时,不会调用 UITableViewController 中的方法。由于 DialogViewController 是 UITableViewController 的子类,这也适用于它。

DialogViewController 使用子类型为 DialogViewController.Source 的 UITableViewSource 对象。如果您想覆盖有问题的方法,那么您需要子类化 DialogViewController.Source 并覆盖那里的方法。

最后,您需要将 DialogViewController 创建的 DialogViewController.Source 替换为您创建的那个。您有机会通过覆盖 CustomDialogViewController 中的 CreateSizingSource () 来执行此操作。

DialogViewController 使用以下 CreateSizingSouce() 实现。

public virtual DialogViewController.Source CreateSizingSource (bool unevenRows)
{
return (!unevenRows) ? new DialogViewController.Source (this) : new DialogViewController.SizingSource (this);
}

如果您的实现不使用 unevenRows,那么您只需要担心返回一种类型的 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);
}
}
}

关于c# - 永远不会调用重写的 DialogViewController 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21580190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com