StringElement派生的控件不更新标题

时间:2013-02-09 23:40:48

标签: iphone ios xamarin.ios monotouch.dialog

我有一个源自MT.D StringElement的控件。可以使用空白/空Caption创建元素,当用户将文本添加到其他控件时,该元素随后会更新。 Caption是MT.D Element类中的一个字段,并且设置它不会自动更新关联的控件。因此,为了尝试更新控件,我创建了一个更新基本字段的属性,然后尝试更新控件。

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

2 个答案:

答案 0 :(得分: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();
            }
        }
    }
}

答案 1 :(得分:0)

除了@Greg Munn的回答之外,您还要确保为元素返回唯一的ID。目前你不是,因此当UITableView将一个与StringELement混合的TestElement单元格出列时,它将重用那些尚未准备好以它们的方式重用的单元格。