2

我有一个我认为非常简单的 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 字段为空白,然后一直向上滚动,然后再次滚动到底部,一组不同的单元格可能是空白的,例如作为 Street2 和州。

显然这不是 Monotouch.Dialog 的正常行为,否则没有人会使用它。我能做些什么来解决这个问题?

4

3 回答 3

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或只是一个空字符串"",这是更直观的想法,但它们表现出同样的问题。

于 2012-12-11T17:29:35.920 回答
1

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

作为一种解决方法,我建议像这样子类化 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 个通常不可见的单元格 - 这强烈表明有 2 个元素与其他元素不同(这就是导致我使用密码元素的原因)。

于 2012-12-06T23:20:14.750 回答
0

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

于 2012-12-04T20:35:13.820 回答