Защо някои от тези клетки 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, "[email protected]", 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 или никой не би го използвал. Какво мога да направя, за да разреша този проблем?


person pdusen    schedule 04.12.2012    source източник
comment
Празни ли са само стойностите на клетките или и етикетите? Най-добрият ви залог вероятно е да използвате източника на MT.D (от github) и да го отстраните. Или ако можете да излезете с изолиран тестов случай, изпратете грешка в Xamarin.   -  person Jason    schedule 05.12.2012
comment
Стойностите не са празни, просто не се виждат на екрана. Трябваше да поясня в заглавието на въпроса.   -  person pdusen    schedule 05.12.2012
comment
това звучи като възможна грешка в MT.D - бих го изпратил на Xamarin, ако можете да създадете изолиран тестов случай   -  person Jason    schedule 05.12.2012
comment
Измислих един и им го изпратих вчера, но все още не съм получил отговор.   -  person pdusen    schedule 06.12.2012
comment
Това обикновено се случва, когато имате различни типове клетки, които използват повторно един и същ reusableIdentifierKey, но изглежда, че всичките ви елементи са EntryElements, така че това не би трябвало да е проблем.   -  person jstedfast    schedule 07.12.2012


Отговори (3)


Обзалагам се, че проблемът е причинен от Password EntryElements, използващи същия „CellKey“ („reusableIdentifier“ на езика на Objective-C) като другите елементи за въвеждане.

Като заобиколно решение бих предложил подкласиране на 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 елемента, които не са като другите (което ме насочи към елементите на паролата).

person jstedfast    schedule 06.12.2012
comment
Ще опитам това, но елементите на паролата никога не са били празни (поне доколкото мога да кажа). Винаги беше една от клетките в най-долната част. - person pdusen; 07.12.2012
comment
Това е интересно... превключването на елементите на паролата към подкласа, който предложихте, елиминира ЕДИН от празните елементи, но все още винаги се показва един. Имате ли други предложения? - person pdusen; 07.12.2012
comment
Не знам, може би emailEntry, защото сте задали надписа на нула? Между другото, елементите, които са празни (или не са празни), не са непременно свързани с това кои клетки причиняват проблема, всичко, на което можете да разчитате, е # празни клетки. - person jstedfast; 07.12.2012

Въз основа на тестова проба, която ми беше изпратена обратно от инженерите на Xamarin, в крайна сметка успях да разреша този проблем, като промених следните редове:

    emailEntry = new EntryElement(null, "[email protected]", String.Empty);
    passwordEntry = new EntryElement (null, "Password", String.Empty, true);
    password2Entry = new EntryElement (null, "Re-enter password", String.Empty, true);

До това:

    emailEntry = new EntryElement(" ", "[email protected]", String.Empty);
    passwordEntry = new EntryElement (" ", "Password", String.Empty, true);
    password2Entry = new EntryElement (" ", "Re-enter password", String.Empty, true);

Моля, обърнете внимание, че това е низ с точно един интервал. Опитах се да го направя с String.Empty или просто с празен низ като "", което е по-интуитивната идея, но те показват същия проблем.

person pdusen    schedule 11.12.2012

pdusen, опитайте да поставите InvokeOnMainThread(ReloadData) след актуализация на модела в HandleGetAccountResponse. Надявам се това да помогне!

person Andrej Gaevskij    schedule 04.12.2012
comment
Друг човек публикува същия отговор, но изглежда го е премахнал. Както им казах, това не решава проблема. Също така, имайте предвид, че повечето от полетата по-горе показват получените данни от профила; само произволна шепа изглеждат празни. - person pdusen; 05.12.2012