Iphone 表视图中的节索引

Iphone 表视图中的节索引,iphone,Iphone,我正在实现一个表索引视图,看到我的表索引在没有实现以下功能的情况下是如何工作的,我感到非常惊讶: - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index method. 我只实施了: - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)table

我正在实现一个表索引视图,看到我的表索引在没有实现以下功能的情况下是如何工作的,我感到非常惊讶:

 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index method.
我只实施了:

 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView 
奇怪的是,当我在断点中运行时,一旦我单击我的任何索引值

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
方法正在被调用

任何线索为什么会发生这种情况,以及sectionForSectionIndexTitle方法的意义是什么

你知道为什么会这样吗

对。当您点击(不要点击iPhone)表的索引时,基础表视图将希望跳转到该部分,以及该部分中的单元格。为了做到这一点,它必须向数据源询问这些单元格,以便在屏幕上渲染它们

它的意义是什么 sectionForSectionIndexTitle方法 那么

的文档(这是
UITableViewDataSource
协议中的可选方法)说明:

要求数据源返回 具有给定属性的节的索引 标题和章节标题索引

您实现此方法仅用于 带有节索引的表视图 只能是表视图的列表 以朴素的风格创建 (UITableViewStylePlain)

这是否适用于您的
UITableView
?换句话说,是否使用分组表视图样式

你知道为什么会这样吗

对。当您点击(不要点击iPhone)表的索引时,基础表视图将希望跳转到该部分,以及该部分中的单元格。为了做到这一点,它必须向数据源询问这些单元格,以便在屏幕上渲染它们

它的意义是什么 sectionForSectionIndexTitle方法 那么

的文档(这是
UITableViewDataSource
协议中的可选方法)说明:

要求数据源返回 具有给定属性的节的索引 标题和章节标题索引

您实现此方法仅用于 带有节索引的表视图 只能是表视图的列表 以朴素的风格创建 (UITableViewStylePlain)


这是否适用于您的
UITableView
?换句话说,您是否使用分组表视图样式?

如果您有一个字母表中所有字母的列表,并且列表中只包含一些条目,则可以使用以下代码:

//要求数据源返回具有给定标题的节的索引和节标题索引。 -(NSInteger)tableView:(UITableView*)分区索引的tableView部分exttitle:(NSString*)标题索引:(NSInteger)索引{

if(tableView==self.searchDisplayController.searchResultsTableView | | self.searchBar.text.length>0)
{
返回0;
}
其他的
{
//直接第一次比赛
if([self.realMIndexArray containsObject:title]){
NSInteger计数=0;
for(self.realMIndexArray中的NSString*字符)
{
if([字符IsequalString:title]){
返回计数;
}
计数++;
}
}
否则{
//从字母表中选取下一个较高的字母,并检查其是否包含在“可用字母列表”中
//如果没有,请选择列表的最后一项
for(int i=[self.indexArray indexOfObject:title]+1;i<[self.indexArray count];i++){
NSString*字符=[self.indexArray objectAtIndex:i];
if([self.realMIndexArray containsObject:character]){
返回[self.realmindexorray indexOfObject:character];
}
}
返回[self.realMIndexArray count]-1;
}
返回0;//如果某个eror donot使d应用程序崩溃
}
}

realMIndexArray count==列表中实际存在的字母 indexArray=alphbeth中所有字母的列表


希望这对某人有所帮助(我花了一点时间来弄清楚)

如果您有一个字母表中所有字母的列表,并且列表中只包含一些条目,您可以使用以下代码:

//要求数据源返回具有给定标题的节的索引和节标题索引。 -(NSInteger)tableView:(UITableView*)分区索引的tableView部分exttitle:(NSString*)标题索引:(NSInteger)索引{

if(tableView==self.searchDisplayController.searchResultsTableView | | self.searchBar.text.length>0)
{
返回0;
}
其他的
{
//直接第一次比赛
if([self.realMIndexArray containsObject:title]){
NSInteger计数=0;
for(self.realMIndexArray中的NSString*字符)
{
if([字符IsequalString:title]){
返回计数;
}
计数++;
}
}
否则{
//从字母表中选取下一个较高的字母,并检查其是否包含在“可用字母列表”中
//如果没有,请选择列表的最后一项
for(int i=[self.indexArray indexOfObject:title]+1;i<[self.indexArray count];i++){
NSString*字符=[self.indexArray objectAtIndex:i];
if([self.realMIndexArray containsObject:character]){
返回[self.realmindexorray indexOfObject:character];
}
}
返回[self.realMIndexArray count]-1;
}
返回0;//如果某个eror donot使d应用程序崩溃
}
}

realMIndexArray count==列表中实际存在的字母 indexArray=alphbeth中所有字母的列表


希望这对某人有所帮助(我花了一点时间才弄明白)

我理解了你的第一点,但为什么单击索引会将我带到正确的部分呢。是的,我正在实现UITableViewStylePlain。您刚才问我“为什么点击(而不是“单击”)索引会将用户带到正确的部分?”。。。因为这就是它应该做的。(我想你不是有意问我这个问题。请重新措辞。)你是对的。我相信这种行为是由tableView:sectionForSectionIndexTitle实现的
if (tableView == self.searchDisplayController.searchResultsTableView || self.searchBar.text.length > 0)
{
    return 0;
}
else
{

    //direct - firsttime match
    if([self.realMIndexArray containsObject:title]) {
        NSInteger count = 0;
        for(NSString *character in self.realMIndexArray)
        {
            if([character isEqualToString:title]){
                return count;
            }
            count ++;
        }
    }
    else {

        //take next higher letter from alphabet and check if its contained in the "available letters list"
        //if not, select last entry of list
        for(int i = [self.indexArray indexOfObject:title] + 1; i < [self.indexArray count]; i++) {

            NSString* character = [self.indexArray objectAtIndex:i];

            if([self.realMIndexArray containsObject:character]) {

                return [self.realMIndexArray indexOfObject:character];

            }

        }

        return [self.realMIndexArray count] - 1;

    }
    return 0;// in case of some eror donot crash d application

}