升级到MT 4.0后,索引表格视图不显示

时间:2011-04-11 20:18:10

标签: ios uitableview xamarin.ios

升级到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的错误吗?

5 个答案:

答案 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构造函数。显式引用选择器的内部调用将需要选择器。通常你不需要一个,但在这种情况下,显然内部的东西被破坏引用选择器。这不是像往常一样抛弃压倒它的理由。如果您有来自您自己的托管代码的外部调用,您仍需要覆盖它。你绝对应该覆盖它。除非你总是在你的代码中明确引用选择器...然后保持它重写。

无论如何,这很多都是我一般的单调理解,我可能是错的。我的意思是,我不知道......我真的不想批评。我只是发表评论,因为在我看来这个帖子中有很多不良信息,我希望这篇文章可以帮助那些可能被误导的人。