Почему некоторые из этих ячеек 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 и знаю, что получаю все необходимые данные. Проблема, с которой я сталкиваюсь, заключается в том, что одна или две случайные ячейки на этой странице кажутся пустыми, даже после того, как их значения были установлены. Например, поля «Почтовый индекс» и «Город» могут оказаться пустыми.

Что еще больше сбивает с толку, так это то, что если я прокручиваю вниз и вижу, что поля Почтовый индекс и Город пусты, затем прокручиваю до конца вверх, затем снова прокручиваю вниз, другой набор ячеек могут быть пустыми, например 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)


Бьюсь об заклад, проблема вызвана тем, что элементы ввода пароля используют тот же «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 с паролем используют по-разному настроенные поля UITextField, это может быть причиной вашей проблемы.

Полезный совет. Если вы столкнулись с такой проблемой, когда некоторые ячейки пусты, почти всегда это связано с тем, что несколько типов ячеек повторно используют один и тот же CellKey. В вашем случае у вас было 2 ячейки, которые обычно были бы невидимыми — это явный признак того, что было 2 элемента, которые не были похожи на другие (именно это привело меня к элементам пароля).

person jstedfast    schedule 06.12.2012
comment
Я попробую, но элементы пароля никогда не были пустыми (насколько я мог судить, по крайней мере). Это всегда была одна из ячеек в самой нижней части. - person pdusen; 07.12.2012
comment
Это интересно ... переключение элементов пароля на подкласс, который вы предложили, устранило ОДИН из пустых элементов, но всегда появляется один. Есть ли у вас другие предложения? - person pdusen; 07.12.2012
comment
Я не знаю, может быть, emailEntry, потому что вы установили для заголовка значение null? Кстати, пустые (или не пустые) элементы не обязательно связаны с тем, какие ячейки вызывают проблему, все, на что вы можете положиться, — это количество пустых ячеек. - 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