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応答を調べて、必要なデータをすべて受け取っていることを確認しました。私が遭遇している問題は、値が設定された後でも、このページの1つまたは2つのランダムなセルが空白に見えることです。たとえば、ZipフィールドとCityフィールドが空白のように見える場合があります。

さらに紛らわしいのは、一番下までスクロールして[Zip]フィールドと[City]フィールドが空白になっていることを確認してから、一番上までスクロールしてから、もう一度一番下までスクロールすると、のセルのセットが空白になる可能性があることです。 Street2およびStateとして。

明らかに、これは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);

スペースが1つだけの文字列であることに注意してください。String.Emptyのような空の文字列を使用して試してみまし""たが、これはより直感的なアイデアですが、同じ問題が発生します。

于 2012-12-11T17:29:35.920 に答える
1

この問題は、他のエントリ要素と同じ「CellKey」(Objective-C用語では「reusableIdentifier」)を使用するPasswordEntryElementsが原因であると思われます。

回避策として、次のように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は異なる構成のUI​​TextFieldsを使用するため、これが問題の原因である可能性があります。

役立つヒント:一部のセルが空白であるこのタイプの問題が発生した場合、ほとんどの場合、複数のタイプのセルが同じCellKeyを再利用していることが原因です。あなたの場合、通常は見えない2つのセルがありました。これは、他の要素とは異なる2つの要素があったことを強く示しています(これが私をパスワード要素に導いた理由です)。

于 2012-12-06T23:20:14.750 に答える
0

pdusen、InvokeOnMainThread(ReloadData)モデルの更新後に配置してみてくださいHandleGetAccountResponse。この助けを願っています!

于 2012-12-04T20:35:13.820 に答える