/ / Pourquoi certaines de ces cellules Monotouch.Dialog apparaissent-elles vides? - c #, ios, xamarin.ios, monotouch.dialog

Pourquoi certaines de ces cellules Monotouch.Dialog apparaissent-elles vides? - c #, ios, xamarin.ios, monotouch.dialog

J'ai ce que je crois être une classe Monotouch.Dialog assez simple.

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;
}
}

Après le chargement de la page, j'appelle de manière asynchrone une API REST pour les informations de compte existantes, qui appelle ensuite HandleGetAccountResponse ci-dessus pour pré-remplir chaque EntryElement dans la boîte de dialogue.

J'inspecte la réponse REST et je sais que je suisrecevoir toutes les données nécessaires. Le problème que je rencontre est qu'une ou deux cellules aléatoires sur cette page semblent être vides, même après que leurs valeurs ont été définies. Par exemple, les champs Zip et Ville peuvent sembler vides.

Ce qui est encore plus déroutant, c'est que si je fais défiler vers le bas et que les champs Zip et Ville sont vides, je fais défiler vers le haut, puis je défile de nouveau vers le bas, un différent un ensemble de cellules peut être vide, comme Street2 et State.

Évidemment, ce n'est pas un comportement normal pour Monotouch.Dialog ou personne ne l'utiliserait. Que puis-je faire pour résoudre ce problème?

Réponses:

1 pour la réponse № 1

Je parie que le problème est dû au mot de passe EntryElements utilisant la même "CellKey" ("reusableIdentifier" dans le jargon Objective-C) que les autres éléments d'entrée.

Comme solution de contournement, je suggère de sous-classer EntryElement comme ceci:

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; }
}
}

Si cela fonctionne, c'est un bogue dans MonoTouch.Dialog (je soumettrai une demande d'extraction au projet github officiel de MonoTouch.Dialog une fois que vous aurez confirmé que cela fonctionne pour vous).

Le problème est que chaque type de celluledoit avoir sa propre "CellKey" si elles sont configurées différemment. Étant donné que les EntryElements avec mot de passe utilisent des UITextFields configurés différemment, cela peut être la cause de votre problème.

Conseil utile: Si vous rencontrez ce type de problème, où certaines cellules sont vides, il est presque toujours dû aux multiples types de cellules réutilisant la même CellKey. Dans votre cas, vous aviez 2 cellules qui seraient généralement invisibles - c'est une forte indication qu'il y avait 2 éléments qui n'étaient pas comme les autres (c'est ce qui m'a conduit vers les éléments Password).


1 pour la réponse № 2

Sur la base d'un échantillon de test qui m'a été renvoyé par les ingénieurs Xamarin, j'ai finalement pu résoudre ce problème en modifiant les lignes suivantes:

    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);

Pour ça:

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

Veuillez noter que c'est une chaîne avec exactement un espace. J'ai essayé de le faire avec String.Empty ou juste une chaîne vide comme "", qui est l'idée la plus intuitive, mais ils présentent le même problème.


0 pour la réponse № 3

pdusen, essayez le lieu InvokeOnMainThread(ReloadData) après la mise à jour du modèle dans HandleGetAccountResponse. J'espère que cette aide!