drawing/showing UITableView items/Cells 的问题
Problems with drawing/showing UITableView items/Cells
我正在开发一个 iOS 应用程序,其中有一个联系人列表。此联系人列表由已从 JSON 字符串反序列化的数据结构填充。
字符串的 JSON 格式正确,列表已正确填充。我将列表传递给 TableView 的数据源并开始构建我的部分和行。
方法NumberOfSections
和RowsInSection
都是return正确的值,但是绘制单元格的方法(GetViewForHeader
、TitleForHeader
、GetHeightForHeader
, GetHeightForRow
) 甚至 returning 单元格 GetCell
都从未被触及过。
这种情况不会一直发生。
我有两个测试用例。
- 包含大约 25 个联系人的列表(姓氏的首字母范围为 B-V)。
- 有 3 个联系人的列表。 (带姓氏首字母T).
列表编号 1 已被检索、填充到列表中并顺利绘制。
清单 2 存在上述问题。
此外,我的 TableView 上有一个搜索功能,当我搜索列表编号 1 以查找特定联系人时,它也不会绘制,即使我传递的列表只包含我正在搜索的一个联系人.
这是我的一些代码片段:
私人会员
private List<Contacts> contacts, filteredContacts;
我的ViewController
里面
public override void ViewDidLoad ()
{
contacts = dataAccessController.GetContacts(userID);
UISearchBar searchBar = new UISearchBar ();
searchBar.TextChanged += (object sender, UISearchBarTextChangedEventArgs e) =>
{
SearchContact (searchBar.Text);
};
}
public void SearchContact (string filter)
{
filteredContacts.Clear();
foreach (c in contacts)
{
if (contact.LastName.ToLower().Contains ()) || contact.ContactID.Contains (filter))
{
if (!filteredContacts.Contains (c)
{
filteredContacts.Add(c);
}
}
}
public void RefreshTableView()
{
ContactOverviewDataSource source;
if (searchBar.Text == null || searchBar.Text == "")
{
source = new ContactOverviewDataSource (contacts);
}
else
{
source = new ContactOverviewDataSource (filteredContacts);
}
source.OnRowSelected += (object sender, ContactOverviewDataSource.RowSelectedEventArgs e) =>
{
// Something something
};
tableContacts.Source = source;
tableContacts.ReloadData ();
}
}
ContactOverViewDataSource
public ContactOverviewDataSource (List<Contact> contacts)
{
this.contacts = contacts;
char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray ();
keys = new string[letters.Length];
for (int i = 0; i < letters.Length; i++)
{
keys [i] = letters [i].ToString ();
}
indexedTableItems = new Dictionary<string, List<Contact>> ();
foreach (var key in keys)
{
List<Contact> temp = new List<Contact> ();
foreach (var contact in contacts)
{
if (contact.LastName.ToLower()[0].ToString() == key.ToLower ())
{
temp.Add (contact);
}
}
indexedTableItems.Add (key, temp);
}
}
public override int NumberOfSections (UITableView tableView)
{
int length = keys.Length;
int xSections = 0;
for (int i = 0; i < length; i++)
{
if (RowsInSection(tableView, i) > 0)
{
xSections++;
}
}
return xSections;
}
public override int RowsInSection (UITableView tableview, int section)
{
return indexedTableItems [keys [section]].Count;
}
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
Contact contact = null;
List<Contact> temp = new List<Contact> ();
foreach (var c in contacts)
{
if (c.LastName.ToLower()[0].ToString() == keys [indexPath.Section].ToLower())
{
temp.Add (c);
}
}
contact = temp [indexPath.Row];
UITableViewCell cell = new UITableViewCell ();
string info = "(" + contact.ContactID + ") " + contact.ContactName;
UILabel lblInfo = new UILabel ();
lblInfo.Text = info;
cell.AddSubview (lblInfo);
return cell;
}
要查看项目的详细信息,您可以单击下面的 pastebin 链接:
联系人概览ViewController:
http://pastebin.com/ggfrKYQP
ContactOverviewDataSource:
http://pastebin.com/N3fGP7xE
您似乎在使用 NumberOfSections 内部的 RowsInSection 来确定是否应显示该部分。这是错误的来源:
假设您有 0 个以字母 A 开头的联系人和 10 个以字母 B 开头的联系人。在这种情况下,A 将不会被计为 NumberOfSections 中的一个部分(不会为空部分调用 xSections++)。当 tableview 稍后为第 0 节调用 NumberOfRows 时,您会期望第 0 节是 B 节,它应该 return 10。但是 indexedTableItems [keys [0]].Count 仍然是 returns 数字A 部分中的项目数,为零。什么都不会显示。
在更新表视图之前,您应该完成过滤过程,包括从数据源中完全删除要隐藏的部分。这将使一切变得简单得多。
我正在开发一个 iOS 应用程序,其中有一个联系人列表。此联系人列表由已从 JSON 字符串反序列化的数据结构填充。
字符串的 JSON 格式正确,列表已正确填充。我将列表传递给 TableView 的数据源并开始构建我的部分和行。
方法NumberOfSections
和RowsInSection
都是return正确的值,但是绘制单元格的方法(GetViewForHeader
、TitleForHeader
、GetHeightForHeader
, GetHeightForRow
) 甚至 returning 单元格 GetCell
都从未被触及过。
这种情况不会一直发生。
我有两个测试用例。
- 包含大约 25 个联系人的列表(姓氏的首字母范围为 B-V)。
- 有 3 个联系人的列表。 (带姓氏首字母T).
列表编号 1 已被检索、填充到列表中并顺利绘制。 清单 2 存在上述问题。
此外,我的 TableView 上有一个搜索功能,当我搜索列表编号 1 以查找特定联系人时,它也不会绘制,即使我传递的列表只包含我正在搜索的一个联系人.
这是我的一些代码片段:
私人会员
private List<Contacts> contacts, filteredContacts;
我的ViewController
里面public override void ViewDidLoad ()
{
contacts = dataAccessController.GetContacts(userID);
UISearchBar searchBar = new UISearchBar ();
searchBar.TextChanged += (object sender, UISearchBarTextChangedEventArgs e) =>
{
SearchContact (searchBar.Text);
};
}
public void SearchContact (string filter)
{
filteredContacts.Clear();
foreach (c in contacts)
{
if (contact.LastName.ToLower().Contains ()) || contact.ContactID.Contains (filter))
{
if (!filteredContacts.Contains (c)
{
filteredContacts.Add(c);
}
}
}
public void RefreshTableView()
{
ContactOverviewDataSource source;
if (searchBar.Text == null || searchBar.Text == "")
{
source = new ContactOverviewDataSource (contacts);
}
else
{
source = new ContactOverviewDataSource (filteredContacts);
}
source.OnRowSelected += (object sender, ContactOverviewDataSource.RowSelectedEventArgs e) =>
{
// Something something
};
tableContacts.Source = source;
tableContacts.ReloadData ();
}
}
ContactOverViewDataSource
public ContactOverviewDataSource (List<Contact> contacts)
{
this.contacts = contacts;
char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToArray ();
keys = new string[letters.Length];
for (int i = 0; i < letters.Length; i++)
{
keys [i] = letters [i].ToString ();
}
indexedTableItems = new Dictionary<string, List<Contact>> ();
foreach (var key in keys)
{
List<Contact> temp = new List<Contact> ();
foreach (var contact in contacts)
{
if (contact.LastName.ToLower()[0].ToString() == key.ToLower ())
{
temp.Add (contact);
}
}
indexedTableItems.Add (key, temp);
}
}
public override int NumberOfSections (UITableView tableView)
{
int length = keys.Length;
int xSections = 0;
for (int i = 0; i < length; i++)
{
if (RowsInSection(tableView, i) > 0)
{
xSections++;
}
}
return xSections;
}
public override int RowsInSection (UITableView tableview, int section)
{
return indexedTableItems [keys [section]].Count;
}
public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
{
Contact contact = null;
List<Contact> temp = new List<Contact> ();
foreach (var c in contacts)
{
if (c.LastName.ToLower()[0].ToString() == keys [indexPath.Section].ToLower())
{
temp.Add (c);
}
}
contact = temp [indexPath.Row];
UITableViewCell cell = new UITableViewCell ();
string info = "(" + contact.ContactID + ") " + contact.ContactName;
UILabel lblInfo = new UILabel ();
lblInfo.Text = info;
cell.AddSubview (lblInfo);
return cell;
}
要查看项目的详细信息,您可以单击下面的 pastebin 链接:
联系人概览ViewController: http://pastebin.com/ggfrKYQP
ContactOverviewDataSource: http://pastebin.com/N3fGP7xE
您似乎在使用 NumberOfSections 内部的 RowsInSection 来确定是否应显示该部分。这是错误的来源:
假设您有 0 个以字母 A 开头的联系人和 10 个以字母 B 开头的联系人。在这种情况下,A 将不会被计为 NumberOfSections 中的一个部分(不会为空部分调用 xSections++)。当 tableview 稍后为第 0 节调用 NumberOfRows 时,您会期望第 0 节是 B 节,它应该 return 10。但是 indexedTableItems [keys [0]].Count 仍然是 returns 数字A 部分中的项目数,为零。什么都不会显示。
在更新表视图之前,您应该完成过滤过程,包括从数据源中完全删除要隐藏的部分。这将使一切变得简单得多。