2011-12-13 11 views
2

MonoTouch.Dialogを使用するStyledStringElement要素を追加します。MonoTouch.Dialog:要素内のテキストの更新

更新する必要が詳細を取得するバックグラウンドタスクがありelement.Value

element.Valueが更新された後、それはテキストが更新されています持っている要素を強制する方法はありますか?

イアン

答えて

12

あなたは、この要素ごとを更新したい場合は、あなたのようなものを使用することができます

public class MyStyledStringElement { 

    public void SetValueAndUpdate (string value) 
    { 
     Value = value; 
     if (GetContainerTableView() != null) { 
      var root = GetImmediateRootElement(); 
      root.Reload (this, UITableViewRowAnimation.Fade); 
     } 
    } 
} 

変動、すなわちroot.Reloadに反復する(すべてをロードし、一度更新するだろう毎月Element)。

+0

要素をプログラムによって反復しますか? – BRogers

+0

これは私にとってはうまくいかず、Captionの値は更新されません。 私は非常に特殊なケースで同様の問題があります。要素を追加した後、キャプションプロパティを変更した後に、「キャプション」ラベルが更新されません。理由は?要素は画面の一番下にあり、コントローラには完全には見えません。だから、境界線の要素を見えるようにtableviewをスクロールすると、キャプションは更新されないように見えます。私は、更新を強制するために境界要素を完全には見えないようにするために、tableviewをプルダウンする必要があります。 – rolivares

+0

いくつかのコードを見ずに言うのは難しいです(質問を作成してより多くのデータを提供する必要があります)。オフスクリーンでは(iOSで)セルがキャッシュされているので、ある時点で再利用され(何か他のもののために)、そのセルに戻ったときにはもう同じセルではありません。最新の値)。それは完全に正常です。 – poupou

1

"this.PrepareCell(cell);をSetValueAndUpdateメソッドに追加して動作しますが、私はまだキャプションの変更を検出してthis.PrepareCell(cell)を呼び出す別のより良いオプションがあると考えています。 。

public void UpdateCaption(string caption) { 
     this.Caption = caption; 
     Console.WriteLine ("actualizando : " + Caption); 
     UITableViewCell cell = this.GetActiveCell(); 
     if (cell != null) { 
      this.PrepareCell (cell); 
      cell.SetNeedsLayout(); 
     } 
} 
0

StyledStringElementまたはStringElementから派生し、直接、細胞内DetailTextLabelをリフレッシュすることであろうラベルを更新するための別のアプローチ:

class UpdateableStringElement : StringElement 
{ 
    public UpdateableStringElement(string name): base (name) 
    { 
    } 

    UILabel DetailText = null; 

    public void UpdateValue(string text) 
    { 
     Value = text; 
     if (DetailText != null) 
      DetailText.Text = text; 
    } 

    public override UITableViewCell GetCell(UITableView tv) 
    { 
     var cell = base.GetCell(tv); 
     DetailText = cell.DetailTextLabel; 
     return cell; 
    } 
} 

の代わりにもしC ValueプロパティUpdateValueメソッドを使用します。

var element = new UpdateableStringElement("demo"); 

SomeEventOfYours += delegate { 
    element.UpdateValue(LocalizedValue); 
};