升级到MT 4.0后,之前在右边框上显示索引的TableViews不再有效。 tableview仍然显示在部分并正常工作,但索引未显示。
我在UITableViewSource中定义了这三种方法,这三种方法似乎都在工作:
public override string[] SectionIndexTitles(UITableView tableView)
public override int SectionFor(UITableView tableView, string Title, int atIndex)
public override string TitleForHeader(UITableView tableView, int section)
还有其他人有这个问题吗?这是MT 4.0的错误吗?
答案 0 :(得分:2)
这是known bug。
看来UITableView没有保留返回的数组,你可以使用 以下是我们进一步调查时解决这个问题的方法:
NSArray array;
[Export ("sectionIndexTitlesForTableView:")]
public NSArray SectionTitles (UITableView tableview)
{
if (array == null) {
string[] titles = new string[RowsInSection(tableview, 0)];
for (int index = 0; index < titles.Length; index++)
titles[index] = index.ToString();
array = NSArray.FromStrings (titles);
}
return array;
}
答案 1 :(得分:2)
这向我展示了数字(第0部分的每个项目的索引(就像索引的一个字母),所以我发现必须将其更改为:
NSArray array;
[Export ("sectionIndexTitlesForTableView:")]
public NSArray SectionTitles (UITableView tableview)
{
if (array == null)
{
array = NSArray.FromStrings (SectionIndexTitles(tableview));
}
return array;
}
答案 2 :(得分:1)
对于所有未能使解决方法正常工作的人:
对我而言,因为我在那里留下了MonoTouch覆盖方法SectionIndexTitles - 一旦我删除它(或者在我的情况下重命名它以便可以从变通方法中调用它),它的工作原理如下所述:)
答案 3 :(得分:0)
得到同样的问题,但上面的修复不起作用,我确信这可能是一件简单的事情,我做错了。以下方法是UITableViewSource的一部分。所有工作都在MT 4.0之前,但文本索引没有出现。代码下方列出的调试输出显示未调用SectionTitles。关于这与上述解决方案有何不同,以及如何使其工作的任何想法?很高兴在这方面开始一个新的主题,但认为有关这个问题的更多信息可能是有用的。
NSArray array;
[Export ("sectionIndexTitlesForTableView:")]
public NSArray SectionTitles(UITableView tableview)
{
Debug.WriteLine("SectionTitles");
if (array == null)
{
array = NSArray.FromStrings(SectionIndexTitles(tableview));
}
return array;
}
public override string[] SectionIndexTitles(UITableView tableView)
{
Debug.WriteLine("SectionIndexTitles");
var sectionIndexTitles = Root.Sections.Select(section => section.IndexTitle ?? string.Empty);
var applySectionIndexTitles = sectionIndexTitles.Any (sectionIndexTitle => !string.IsNullOrEmpty (sectionIndexTitle));
foreach (string s in sectionIndexTitles)
{
Debug.WriteLine(s);
}
Debug.WriteLine("applySectionIndexTitles = " + applySectionIndexTitles);
return applySectionIndexTitles ? sectionIndexTitles.ToArray () : null;
}
调试输出:
SectionIndexTitles
A
乙
C
d
电子
˚F
ħ
Ĵ
ķ
→
中号
<磷>氮0
P
[R
取值
Ť
w ^
applySectionIndexTitles = True
答案 4 :(得分:0)
首先,为什么这些例子使用支持NSArray?为什么不是后缀数据的字符串[]?仅仅因为该方法返回NSArray并不意味着您必须使用NSArray支持它。让人惊讶。除非必须,否则为什么要使用NSArray。你不必在这里。
其次,实际上,我总是将我的索引标题存储在后备字符串[]中。这是正常的用法我会说。你为什么不这样做呢?这里的答案让它听起来像是一个特殊情况或者你必须存储它的东西。据我所知,无论如何你总是负责这样做。另一个依靠细胞获取数据的例子......为什么到地球?如果你不能简单地使用一个数组,那就得到你的数组不在范围内的线索。
此外,有些人提到不要像往常一样覆盖。嗯......我不知道。这与我见过的所有单触引代码完全矛盾。我已经看到很多例子都做了,这是有道理的。查看一些模板UIViewController构造函数。显式引用选择器的内部调用将需要选择器。通常你不需要一个,但在这种情况下,显然内部的东西被破坏引用选择器。这不是像往常一样抛弃压倒它的理由。如果您有来自您自己的托管代码的外部调用,您仍需要覆盖它。你绝对应该覆盖它。除非你总是在你的代码中明确引用选择器...然后保持它重写。
无论如何,这很多都是我一般的单调理解,我可能是错的。我的意思是,我不知道......我真的不想批评。我只是发表评论,因为在我看来这个帖子中有很多不良信息,我希望这篇文章可以帮助那些可能被误导的人。