1

MonoTouch Dialog の MvvmCross 実装で DateElement を使用しています。DateTimeElement のメソッド UpdateDetailDisplay(UITableViewCell cell) は、セル パラメータが null になることはないと想定しているため、例外が発生します。

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

このメソッドは、Dialog ビューのセットアップ中に 3 回呼び出されるようです。

  1. DateElement のインスタンスを作成した結果として

  2. バインディングについて

  3. GetCell が呼び出されたときの TableView の構築中。

セル パラメータは、イベント 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 から独自のクラスを派生させることによってのみ、問題を「回避」できました。

public class 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 がリストのずっと下にあるため、このバグがサンプルで発生していると思います。そのため、テーブルが最初に描画されたときに画面に表示されません (セルを取得しません)。


最善の解決策があなたが見つけたものであるかどうか、または UpdateXXXDisplay を呼び出して最初に null をチェックする ValueElement のコードを変更するかどうか (または防御的で両方を行うかどうか) は明確ではありません。

    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 に答える