drawing/showing UITableView items/Cells 的问题

Problems with drawing/showing UITableView items/Cells

我正在开发一个 iOS 应用程序,其中有一个联系人列表。此联系人列表由已从 JSON 字符串反序列化的数据结构填充。

字符串的 JSON 格式正确,列表已正确填充。我将列表传递给 TableView 的数据源并开始构建我的部分和行。

方法NumberOfSectionsRowsInSection都是return正确的值,但是绘制单元格的方法(GetViewForHeaderTitleForHeaderGetHeightForHeader, GetHeightForRow) 甚至 returning 单元格 GetCell 都从未被触及过。

这种情况不会一直发生。

我有两个测试用例。

  1. 包含大约 25 个联系人的列表(姓氏的首字母范围为 B-V)。
  2. 有 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 部分中的项目数,为零。什么都不会显示。

在更新表视图之前,您应该完成过滤过程,包括从数据源中完全删除要隐藏的部分。这将使一切变得简单得多。