2011-04-11 53 views
5

升级到MT 4.0后,以前在右侧边框上显示索引的TableView不再有效。 tableview仍然显示在部分并正常工作,但索引不显示。索引表视图在升级到MT 4.0后不显示

我在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的错误吗?

回答

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; 
} 
+0

只是为了澄清,你把这个添加到UITableViewSource?有同样的问题,但无法得到此修复程序的工作(或下面的建议)。 – 2011-04-24 09:13:08

+0

您是否试图让索引第一次显示,或者您是否尝试修复之前正在运行但在MT 4.0下已损坏的索引? – Jason 2011-04-24 13:14:50

+0

以前工作,升级到MT 4.0后发生故障。 – 2011-04-24 23:26:09

2

这是给我看只是数字(指数为每段0(如索引的字母)的项目,所以我发现,必须把它改成:

 NSArray array; 

     [Export ("sectionIndexTitlesForTableView:")] 
     public NSArray SectionTitles (UITableView tableview) 
     {     
      if (array == null) 
      {   
       array = NSArray.FromStrings (SectionIndexTitles(tableview)); 
      } 

      return array; 
     } 
0

获得了同样的问题,但上面的修复没有工作,我相信这是可能的东西简单,我做错了。下面的方法ds是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

Ç

d

ë

˚F

ģ

ħ

Ĵ

ķ

大号

中号

Ñ

ö

P

ř

小号

Ť

W¯¯

applySectionIndexTitles =真

+0

我只是仔细检查了我的代码,你看起来和我一样。你是否也定义了SectionFor()和TitleForHeader()方法?如果仍然无法正常工作,则可以尝试向该错误添加注释,以查看是否可以在解决方法上获得更多反馈。 – Jason 2011-04-25 04:12:52

+0

这两个SectionFor()广告TitleForHeader()是定义,仍然是一个问题...将尝试和虚构了一个简单的例子,并提供给单声道的家伙。查看官方错误的更新,还有一些其他人在解决方法中遇到问题。感谢您的帮助! – 2011-05-02 01:50:02

1

向我不会得到解决方法正常工作的人:

对我来说,这是因为我离开了MonoTouch覆盖方法SectionIndexTitles在那里 - 只要我删除它(或在我的情况下重命名它,所以它可以被称为从解决方法),它的工作描述:)

0

哇,这里的答案是一个非常误导。我从哪说起呢?

首先,为什么使用支持NSArray的示例?为什么不用一个字符串[]作为后备数据?仅仅因为该方法返回一个NSArray并不意味着你必须使用NSArray来支持它。让人惊讶。除非必须,否则为什么要使用NSArray?你不必在这里。

其次,实际上,我总是将我的索引标题存储在背景字符串[]中。这是我说的正常用法。你为什么不那么做?这里的答案使它听起来像是一个特殊情况或者你必须存储它的东西。据我所知,无论如何你总是有责任这样做。另一个依靠细胞获取数据的例子......为什么要在地球上?如果你不能简单地使用一个数组,那么得到一个线索,你的数组超出了范围或某物。

另外,有些人提到不会像通常那样重写。呃......我不知道那个。这完全违背了我见过的所有单点触控代码。我见过很多例子都可以做到这一点,这是有道理的。看看一些模板UIViewController的构造函数。显式引用选择器的内部调用将需要选择器。通常你不需要一个,但在这种情况下,显然是引用选择器的内部中断。这不是像平常那样忽略它的原因。如果您有一些来自您自己的托管代码的外部呼叫,您仍然需要覆盖它。你绝对应该重写它。除非您始终在您的代码中明确引用选择器,否则请将其重写。

无论如何,很多这是我的一般monotouch了解,我可能是错的。我的意思是,我不知道......我真的不想批评。我只是不得不发表评论,因为它看起来像这个线程中有很多不良信息,我希望这篇文章能够帮助那些可能被误导的人。

相关问题