从未调用重写的DialogViewController方法?

时间:2014-02-05 14:36:33

标签: c# xamarin.ios monotouch.dialog

这是我的第一个问题,如果不是最好的话,我道歉。

我是使用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 Dialog更好地控制行选择。我试图获得取消行更改的效果,以便在单击时不会选择另一行,我认为这些是正确的方法,我只是不明白为什么它们永远不会被击中而我觉得它是一个真的很简单。

感谢。

2 个答案:

答案 0 :(得分:3)

我是否以正确的方式接近这个我不确定但是我确实从某人那里得到了关于我被覆盖的方法未被调用的确切问题的答案,所以我会发布他们的答案,以防任何人有同样的问题。感谢来自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);
        }
    }
}

答案 1 :(得分:0)

这些方法旨在使托管的UITableViewController符合ObjC UITableViewDataSource协议。然后您可以使用:

this.TableView.WeakDataSource = this;

在您的控制器中。

使用MT.Dialog只处理元素,并且仅在极少数情况下处理基础UITableView。通常,您的元素具有点击/点击处理程序。在那些,执行您的行动。