我认为这是一个非常简单的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字段可能显示为空白。
更令人困惑的是,如果我滚动到底部并看到Zip和City字段为空白,则一直向上滚动,然后再次滚动到底部,不同单元格集可能为空,例如Street2和State。
显然,这对Monotouch.Dialog来说不是正常行为,也没有人会使用它。我该怎么做才能解决这个问题?
答案 0 :(得分:1)
我敢打赌,问题是由Password EntryElements引起的,使用与其他条目元素相同的“CellKey”(Objective-C语言中的“reusableIdentifier”)。
作为一种解决方法,我建议像这样继承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个元素与其他元素不同(这是导致我走向密码元素的因素)。
答案 1 :(得分: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
或仅使用""
这样的空字符串,这是更直观的想法,但它们也表现出同样的问题。
答案 2 :(得分:0)
pdusen,在InvokeOnMainThread(ReloadData)
中的模型更新后尝试放置HandleGetAccountResponse
。希望这有帮助!