UITableView.RectForHeaderInSection导致'请求无效节的矩形'异常,为什么?

时间:2013-08-15 20:47:22

标签: ios uitableview xamarin.ios

我目前正在为UITableView实现自定义标头以及UITableView类中已有的标头(因此我们可以将标题标题和字幕标题一起浮动在顶部)。

为了做到这一点,我的表分为许多部分,可以是:

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

两种类型的部分都可以包含行,并且实现工作正常,直到我尝试使用2个自定义标头。

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

  

NSInternalInconsistencyException:无效部分(6)中对标题的rect的请求

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

我正在使用RectForHeaderInSection将我的浮动标题放在应有的位置。

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

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

编辑:我意识到,当我说段数应为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,它仍然有效。只要我只有一个自定义标头,该应用程序不会崩溃。

1 个答案:

答案 0 :(得分:2)

你是对的,&#34;是否有可能删除该部分或者即使它们被添加到源中也从未添加过部分?&#34;。它们没有添加在表格中。

你必须致电:

ReloadData() 
在您的tableView上

将源与表的数据同步,以防止无效的段索引。