为什么这些Monotouch.Dialog细胞中的一些出现空?

时间:2012-12-04 15:53:11

标签: c# ios xamarin.ios monotouch.dialog

我认为这是一个非常简单的Monotouch.Dialog课程。

public partial class EditAccountDialog : DialogViewController
{
    Section emailSection;
    Section passwordSection;
    Section profileSection;
    Section addressSection;

    EntryElement emailEntry;
    EntryElement passwordEntry;
    EntryElement password2Entry;
    EntryElement firstNameEntry;
    EntryElement lastNameEntry;
    EntryElement phoneNumberEntry;
    EntryElement streetEntry;
    EntryElement street2Entry;
    EntryElement cityEntry;
    EntryElement stateEntry;
    EntryElement zipEntry;

    public EditAccountDialog(bool pushing) : base (UITableViewStyle.Grouped, null, pushing)
    {
        emailEntry = new EntryElement(null, "example@domain.com", String.Empty);
        passwordEntry = new EntryElement (null, "Password", String.Empty, true);
        password2Entry = new EntryElement (null, "Re-enter password", String.Empty, true);
        firstNameEntry = new EntryElement ("First Name", "First Name", String.Empty);
        lastNameEntry = new EntryElement ("Last Name", "Last Name", String.Empty);
        phoneNumberEntry = new EntryElement ("Phone Number", "###-###-####", String.Empty);
        streetEntry = new EntryElement ("Street", "#### Any St.", String.Empty);
        street2Entry = new EntryElement ("Street 2", "Apt #", String.Empty);
        cityEntry = new EntryElement ("City", "City", String.Empty);
        stateEntry = new EntryElement ("State", "State", String.Empty);
        zipEntry = new EntryElement ("ZIP Code", "#####", String.Empty);

        emailSection = new Section ("Email"){
            emailEntry,
        };

        passwordSection = new Section ("Password"){
            passwordEntry,
            password2Entry,
        };

        profileSection = new Section("Profile") {
            firstNameEntry,
            lastNameEntry,
            phoneNumberEntry,
        };

        addressSection = new Section("Address") {
            streetEntry,
            street2Entry,
            cityEntry,
            stateEntry,
            zipEntry,
        };

        Root = new RootElement("Edit Account") {
            emailSection,
            passwordSection,
            profileSection,
            addressSection,
        };
    }

    public virtual void HandleGetAccountResponse(GetAccountResponse response)
    {
        emailEntry.Value = response.Email;
        firstNameEntry.Value = response.FirstName;
        lastNameEntry.Value = response.LastName;
        phoneNumberEntry.Value = response.Phone;
        streetEntry.Value = response.StreetAdd;
        street2Entry.Value = response.StreetAdd2;
        cityEntry.Value = response.City;
        stateEntry.Value = response.State;
        zipEntry.Value = response.Zip;
    }
}

页面加载后,我异步调用REST API以获取现有帐户信息,然后调用上面的HandleGetAccountResponse以预先填充对话框中的每个EntryElement

我检查REST响应并知道我收到了所有必要的数据。我遇到的问题是,即使设置了它们的值,此页面上的一个或两个随机单元格也显示为空白。例如,Zip和City字段可能显示为空白。

更令人困惑的是,如果我滚动到底部并看到Zip和City字段为空白,则一直向上滚动,然后再次滚动到底部,不同单元格集可能为空,例如Street2和State。

显然,这对Monotouch.Dialog来说不是正常行为,也没有人会使用它。我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:1)

我敢打赌,问题是由Password EntryElements引起的,使用与其他条目元素相同的“CellKey”(Objective-C语言中的“reusableIdentifier”)。

作为一种解决方法,我建议像这样继承EntryElement:

public class PasswordEntryElement : EntryElement
{
    static readonly NSString PasswordEntryElementCellKey = new NSString ("PasswordEntryElement");

    public PasswordEntryElement (string caption, string placeholder, string value) : base (caption, placeholder, value, true)
    {
    }

    protected override NSString CellKey {
        get { return PasswordEntryElementCellKey; }
    }
}

如果这样可行,那么这是MonoTouch.Dialog中的一个错误(一旦你确认这对你有用,我会向官方的MonoTouch.Dialog github项目提交一个拉取请求。)

问题是,如果配置不同,每种类型的单元确实需要拥有自己的“CellKey”。由于密码注册的EntryElements使用不同配置的UITextFields,这可能是导致问题的原因。

有用的提示:如果遇到这种类型的问题,其中一些单元格是空白的,几乎总是由于多种类型的单元格重用相同的CellKey。在你的情况下,你有两个通常是不可见的单元格 - 这是一个强烈的迹象,表明有2个元素与其他元素不同(这是导致我走向密码元素的因素)。

答案 1 :(得分:1)

基于Xamarin工程师发回给我的测试样本,我最终能够通过更改以下行来解决此问题:

    emailEntry = new EntryElement(null, "example@domain.com", String.Empty);
    passwordEntry = new EntryElement (null, "Password", String.Empty, true);
    password2Entry = new EntryElement (null, "Re-enter password", String.Empty, true);

对此:

    emailEntry = new EntryElement(" ", "example@domain.com", String.Empty);
    passwordEntry = new EntryElement (" ", "Password", String.Empty, true);
    password2Entry = new EntryElement (" ", "Re-enter password", String.Empty, true);

请注意只有一个空格的字符串。我尝试使用String.Empty或仅使用""这样的空字符串,这是更直观的想法,但它们也表现出同样的问题。

答案 2 :(得分:0)

pdusen,在InvokeOnMainThread(ReloadData)中的模型更新后尝试放置HandleGetAccountResponse。希望这有帮助!