1

MT.Dから派生したコントロールがありStringElementます。要素は空白/空Captionで作成でき、ユーザーが別のコントロールにテキストを追加すると後で更新されます。CaptionはMT.DElementクラスのフィールドであり、これを設定しても、関連するコントロールは自動的に更新されません。そのため、コントロールを更新するために、ベースフィールドを更新するプロパティを作成してから、コントロールを更新しようとしました。

public new string Caption {
    get {
        return base.Caption;
    }
    set {
        base.Caption = value;
        var cell = GetActiveCell();
        if (cell != null) {
            cell.TextLabel.Text = value;
        }
    }
}

残念ながら、UIは新しい値で更新されていません。デバッガーを使用すると、新しい値が正しく設定されていることがわかりますが、テキストが表示されていません。空白以外のコントロールを作成すると、Caption正しく表示されます。ImageView同様のアプローチを使用して、正しく機能するコントロールを更新します。

private void SetUiState(){
    var cell = this.GetActiveCell();
    if (cell != null) {
        var imgView = cell.ImageView;
        if (imgView != null) {
            imgView.Image = _isEnabled ? _enabledImage : _disabledImage;
        }
        cell.SelectionStyle = _isEnabled ? UITableViewCellSelectionStyle.Blue : UITableViewCellSelectionStyle.None;
    }
}

なぜそれが細胞のために機能しないのか考えはありTextLabelますか?

4

2 に答える 2

3

これは前に見たことがありますが、テキストの変更に対応するためにTextLabelのフレームを変更する必要があるため、セルを再レイアウトする必要があります。

public class TestElement : StringElement
{
    public TestElement() : base("")
    {

    }

    public new string Caption {
        get 
        {
            return base.Caption;
        }

        set 
        {
            base.Caption = value;
            var cell = GetActiveCell();
            if (cell != null) 
            {
                cell.TextLabel.Text = value;
                cell.SetNeedsLayout();
            }
        }
    }
}
于 2013-02-10T03:23:48.997 に答える
0

@Greg Munnからの回答に加えて、要素の一意のIDを返すようにする必要があります。現在はそうではないため、UITableViewがStringELementと混合されたTestElementのセルをデキューすると、そのまま再利用する準備ができていないセルが再利用されます。

于 2013-02-11T00:00:59.363 に答える