1

我在 MonoTouch Dialog 的 MvvmCross 实现中使用 DateElement。发生异常是因为 DateTimeElement 中的方法 UpdateDetailDisplay(UITableViewCell cell) 期望 cell 参数永远不会为空。

    protected override void UpdateDetailDisplay(UITableViewCell cell)
    {
        if (cell.DetailTextLabel != null)
        {
            cell.DetailTextLabel.Text = FormatDate(Value);
        }
    }

似乎在设置 Dialog 视图期间调用了此方法 3 次:

  1. 作为创建 DateElement 实例的结果

  2. 关于绑定

  3. 在调用 GetCell 时构建 TableView 期间。

cell 参数仅出现在事件 3 上。

我是不是做错了什么,或者该方法是否应该像 StringElement 那样对参数为 null 进行测试?

这是我在 MvxTouchDialogViewController 派生的 ViewDidLoad 事件中的代码:

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        this.Root = new RootElement("Sign-Up")
        {
            new Section()
            {
                Bind( new EntryElement("Gender:", "required"), "{'Value':{'Path':'Gender','Mode':'TwoWay'}}"),
                Bind( new EntryElement("First name:", "required"), "{'Value':{'Path':'FirstName','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Last name:", "required"), "{'Value':{'Path':'LastName','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Display name:", "required"), "{'Value':{'Path':'DisplayName','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Email:", "required"), "{'Value':{'Path':'Email','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Confirm email:", "required"), "{'Value':{'Path':'ConfirmEmail','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Password:", "required",null,true), "{'Value':{'Path':'Password','Mode':'TwoWay'}}"),
                Bind( new EntryElement("Confirm password:", "required", null,true), "{'Value':{'Path':'ConfirmPassword','Mode':'TwoWay'}}"),
                Bind (new DateElement("Date of birth", DateTime.Now), "{'Value':{'Path':'DateOfBirth','Mode':'TwoWay'}}")
            },
        };
    }

我只能通过使用我自己的方法从 DateElement 派生我自己的类来“解决”这个问题:

公共类 MyDateElement : DateElement { public MyDateElement (string caption, DateTime date) : base (caption, date) { }

    protected override void UpdateDetailDisplay(UITableViewCell cell)
    {
        if(cell == null)return;

        if (cell.DetailTextLabel != null)
        {
            cell.DetailTextLabel.Text = FormatDate(Value);
        }
    }
}
4

1 回答 1

0

这看起来像是 MonoTouch.Dialog 和/或 MvvmCross 中的某个错误。

难道我做错了什么?

不。在我看来,你做的事情是对的。

我猜这个错误出现在您的示例中,因为 DateTimeElement 在列表中很长 - 所以当第一次绘制表格时它不在屏幕上(没有获得单元格)。


我不清楚最好的解决方案是否是您找到的解决方案,或者是否更改 ValueElement 中调用 UpdateXXXDisplay 以首先检查 null 的代码(或者是否要防御并同时做这两个!)

    private UITextAlignment _alignment;
    public UITextAlignment Alignment
    {
        get { return _alignment; }
        set { _alignment = value; UpdateCaptionDisplay(CurrentAttachedCell);}
    }

    private TValueType _value;
    public TValueType Value
    {
        get { return _value; }
        set { _value = value; UpdateDetailDisplay(CurrentAttachedCell); }
    }

我将在https://github.com/slodge/MvvmCross/issues中将此作为问题记录下来,然后尽快修复它...

感谢您找到这个 - 以及非常详细的说明

于 2012-06-19T17:05:19.640 回答