2012-06-19 2 views
1

Я использую DateElement в реализации MonoTouch Dialog MvvmCross. Исключение происходит потому, что метод UpdateDetailDisplay (ячейка UITableViewCell) в DateTimeElement ожидает, что параметр ячейки никогда не будет равен нулю.MvvmCross - Null Исключение при использовании DateTimeElement в MonoTouch-Dialog

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

Кажется, что этот метод вызывается три раза в течение установленного планом диалоговый:

  1. в результате создания экземпляра DateElement

  2. на связывание

  3. во время создания TableView при вызове GetCell.

Параметр клетка присутствует только на события 3.

Я делаю что-то неправильно или если метод есть тест по параметру, как нуль StringElement имеет?

Вот мой код в случае ViewDidLoad в моей производной MvxTouchDialogViewController:

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 { общественных MyDateElement (строка заголовка, дата DateTime) : основание (заголовок, дата) { }

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

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

ответ

0

Похоже, что это ошибка где-то в MonoTouch.Dialog и/или MvvmCross.

Я что-то не так?

Нет. Мне кажется, что вы все делаете правильно.

Я предполагаю, что эта ошибка встречается в вашем примере, потому что DateTimeElement длинный путь вниз по списку - и поэтому он не находится на экране (не получает ячейку), когда таблица сначала нарисована.


Это мне не ясно, является ли лучшим решением является тот, который вы нашли, или изменить код в ValueElement который вызывает UpdateXXXDisplay для проверки нулевой первой (или нужно ли защищаться и то и другое!)

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, а затем исправить его в ближайшее время ...

Спасибо за нахождение в этом - и за очень подробными примечаниями

+0

зашел на https://github.com/slodge/MvvmCross/issues/13 – Stuart

+0

Я принимаю это как комплимент.Просто чтобы подтвердить, параметр ячейки всегда равен null, пока TableView не свяжется с источником и не начнет называть source.GetCell (...) –

+0

Phew - Он был предназначен как комплимент - и в качестве благодарности :) – Stuart