0

除了 UITableView 类中已有的标题之外,我目前正在为 UITableView 实现自定义标题(这样我们就可以同时在顶部浮动标题标题和副标题标题)。

为此,我的表格分为许多部分,可以是:

  • 一个标题部分,它实际上是一个以空 UIView 作为标题的部分(因为我希望我的自定义标题浮动在那个空视图上)。
  • 或者它可以是一个字幕部分,这是一个使用iOS提供的标题的普通部分(滚动时已经浮动在顶部的部分)。

两种类型的部分都可以在其中包含行,并且在我尝试使用 2 个自定义标题之前,实现工作完美。

当我尝试添加第二个自定义标头时,调用该UITableView.RectForHeaderInSection方法时出现此异常:

NSInternalInconsistencyException:请求无效部分中的标头矩形(6)

问题是我调用this.UITableView.RectForHeaderInSection(6)了,当异常弹出时(在同一行),我可以看到我的表至少有 7 个部分,因此,第 6 个部分不应该是无效的。

RectForHeaderInSection用来将我的浮动标题放在它应该在的地方。

有谁知道为什么即使该部分不应该无效它也会崩溃?或者也许是另一种获取我需要放置浮动标题的确切框架的方法(这将是我在标题部分创建的空表视图标题的框架)?

我只发现这个问题可能与我的问题有关,但在这种情况下,我认为问题的根源并不相同。

编辑:我意识到,当我说节数应该是 7 时,它是 UITableViewSource 子类中的节数,而不是表中的“实际”节数。即使将它们添加到源中,该部分是否有可能被删除或从未添加?除了查看源中的列表之外,我如何查看表中的部分数量?

明天我可能会发布我的部分代码,因为现在我知道没有足够的信息来找到问题所在。

编辑2:这是代码的样子:

// first we create the custom header (Title)
var title1 = new CustomHeader();

var section1 = this.Table.TableSource.AddSection();
section1.HeaderView = title1.View;
// Fill section 1 with rows...
var section2 = this.Table.TableSource.AddSection();
// Fill section 2 with rows...

// We create the list of sections that our Title will contain
var title1Sections = new List<TableSection>();
title1Sections.Add(section1);
title1Sections.Add(section2);

// Now we call the method that will create our custom header
this.Table.TableSource.AddHeader(title1.View, title1Sections, this.Table.TableSource.Sections.IndexOf(section1);

所以有了这个,我们有第 1 部分,它有一个自定义标题标题,它浮动在第 1 部分和第 2 部分上。第 2 部分有一个正常的字幕标题,当它们相互碰撞时,它会在标题标题下浮动。现在 AddHeader 方法:

public void AddHeader(UIView headerView, List<TableSection> sections, int indexOfFirstSection)
{
    RectangleF rectForHeaderInTableView = this.TableView.RectForHeaderInSection(indexOfFirstSection); /* CRASHES HERE */
    // Code that uses rectForHeaderInTableView to make our custom header float over everything...
}

如果我只有一个这样的自定义标头,则应用程序运行良好并且没有崩溃。但是,如果我以与此处相同的方式添加更多部分(比如说第 3-4 部分)并添加自定义标题,当它尝试添加第二个自定义标题时,应用程序将在尝试获取 rectForHeaderInSection 时崩溃。如果我决定不为第 1-2 节设置自定义标题,而是为第 3-4 节设置一个自定义标题,它仍然有效。只要我只有一个自定义标题,应用程序就不会崩溃。

4

1 回答 1

2

你是对的,“是否有可能该部分被删除或从未添加,即使它们已添加到源中?”。它们没有添加到表中。

您必须致电:

ReloadData() 

在您的 tableView 上将源与表的数据同步,以防止无效的部分索引。

于 2013-09-26T17:55:00.390 回答