【问题标题】:Make UITableView scrollable by index使 UITableView 可按索引滚动
【发布时间】:2011-09-13 21:04:23
【问题描述】:

我正在尝试创建一个UITableView 索引以更快地滚动大UITableView,我的索引显示在右侧,但是当我尝试使用它滚动时,它不起作用..

我想知道我是否错过了什么,所以我想知道我是否还有其他事情要做,或者类似的事情。

#pragma - TableView Index Scrolling

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {

    if(searching)
        return nil;

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    [tempArray addObject:@"A"];
    [tempArray addObject:@"B"];
    [tempArray addObject:@"C"];
    [tempArray addObject:@"D"];
    [tempArray addObject:@"E"];
    [tempArray addObject:@"F"];
    [tempArray addObject:@"G"];
    [tempArray addObject:@"H"];
    [tempArray addObject:@"I"];
    [tempArray addObject:@"J"];
    [tempArray addObject:@"K"];
    [tempArray addObject:@"L"];
    [tempArray addObject:@"M"];
    [tempArray addObject:@"N"];
    [tempArray addObject:@"O"];
    [tempArray addObject:@"P"];
    [tempArray addObject:@"Q"];
    [tempArray addObject:@"R"];
    [tempArray addObject:@"S"];
    [tempArray addObject:@"T"];
    [tempArray addObject:@"U"];
    [tempArray addObject:@"V"];
    [tempArray addObject:@"W"];
    [tempArray addObject:@"Y"];
    [tempArray addObject:@"X"];
    [tempArray addObject:@"Z"];

    return tempArray;
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {

    if(searching)
        return -1;

    return index % 2;
}

【问题讨论】:

    标签: iphone ios uitableview indexing


    【解决方案1】:

    你可以用这个

    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
    

    这告诉表格哪个部分对应于部分标题/索引(例如“B”,1))

    此方法用于返回与标题对应的部分。但是您想根据这些标题滚动您的单个部分的行。 所以请按照以下步骤操作:

    1. 创建全局数组意味着在.h文件中声明它

      NSMutableArray *alphabetsArray;
      NSMutableArray *dataArray; //--This contain your cell value i.e. Honda,Mazda--//
      
    2. viewDidLoad 方法中定义它,如下所示,然后从 UITableView 方法中返回它..

      alphabetsArray = [[NSMutableArray alloc] init];
      [alphabetsArray addObject:@"A"];
      [alphabetsArray addObject:@"B"];
      [alphabetsArray addObject:@"C"];
      [alphabetsArray addObject:@"D"];
      [alphabetsArray addObject:@"E"];
      [alphabetsArray addObject:@"F"];
      [alphabetsArray addObject:@"G"];
      [alphabetsArray addObject:@"H"];
      [alphabetsArray addObject:@"I"];
      [alphabetsArray addObject:@"J"];
      [alphabetsArray addObject:@"K"];
      [alphabetsArray addObject:@"L"];
      [alphabetsArray addObject:@"M"];
      [alphabetsArray addObject:@"N"];
      [alphabetsArray addObject:@"O"];
      [alphabetsArray addObject:@"P"];
      [alphabetsArray addObject:@"Q"];
      [alphabetsArray addObject:@"R"];
      [alphabetsArray addObject:@"S"];
      [alphabetsArray addObject:@"T"];
      [alphabetsArray addObject:@"U"];
      [alphabetsArray addObject:@"V"];
      [alphabetsArray addObject:@"W"];
      [alphabetsArray addObject:@"Y"];
      [alphabetsArray addObject:@"X"];
      [alphabetsArray addObject:@"Z"];
      

      [注意:你也可以用动态创建alphabetsArray 包含根据您的 dataArray。为此,请遵循 我们如何 在下面创建动态部分索引标题数组]

    3. 现在使用上面提到的方法来获取标题

      - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
          return alphabetsArray;
      }
      
    4. 编写你的逻辑来滚动 UITableView

      - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
          for (int i = 0; i< [dataArray count]; i++) {
              // Here you return the name i.e. Honda,Mazda 
              // and match the title for first letter of name
              // and move to that row corresponding to that indexpath as below
              NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1];
              if ([letterString isEqualToString:title]) {
                  [tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
                  break;
              }
          }
          return -1;
      }
      

    ****我们如何创建动态部分索引标题数组****

    1. 让我们假设dataArray是这样的

      [@"Honda",@"Maruti",@"Mazda",@"Toyota",.....]  
      
    2. 如下创建动态节索引标题数组的方法

      - (void)createAlphabetArray;
      
    3. 实现createAlphabetArray方法如下

      #pragma mark - Create Alphabet Array
      - (void)createAlphabetArray {
          NSMutableArray *tempFirstLetterArray = [[NSMutableArray alloc] init];
          for (int i = 0; i < [dataArray count]; i++) {
              NSString *letterString = [[dataArray objectAtIndex:i] substringToIndex:1];
              if (![tempFirstLetterArray containsObject:letterString]) {
                  [tempFirstLetterArray addObject:letterString];
              }
          }
          alphabetsArray = tempFirstLetterArray;
          [tempFirstLetterArray release];
      }
      
    4. 现在只要你想改变字母数组包含的任何地方调用它

      [self createAlphabetArray]; 
      

    现在您可以根据您的 dataArray 内容动态创建动态节索引标题数组。

    【讨论】:

    • 太棒了...你把每件事都说得很清楚,我不需要再看任何教程了...谢谢:)
    • 您好,感谢您的回答。有用!但只是想知道你们返回方法的整数是多少 - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index ?我刚刚返回了一个随机数,例如100 和右侧索引正常工作(它滚动)。那么从那个方法返回的索引号并不重要?
    • @LalitKumar - 实际上,从某种意义上说,如果您在那里返回有效的部分索引,那么UITableView 将尝试滚动自身,从而否定尝试手动滚动它。有必要从此函数返回一个与有效节索引不对应的值(或根本不返回任何内容)。我建议在这种情况下使用NSNotFound 是一个合理的返回值。
    • return 0 对我不起作用,所以我添加了 return 1;现在效果很好。
    • 为了澄清以上所有内容,您需要从sectionForSectionIndexTitle 返回一个不存在的索引号。如果您返回 0(或其他确实存在的部分值),视图将滚动到该部分而不是您的选择。
    【解决方案2】:

    我相信表格视图需要按字母顺序分组 - 临时数组不知道如何将您选择的字母转换为特定索引(它不知道“a”、“b”或“ c" 意思)。

    如果您查看 ipod 歌曲列表,您会注意到每个字母组都有一个字母部分分隔符。您需要将表格对象分组到以字母为标题的部分中,以便将字母“A”转换为索引。苹果的 ipod 列表实际上所做的不是滚动到第一个“A”条目,而是滚动到“A”部分的开头。

    【讨论】:

    • 好的,我认为可能是这种情况,感谢您的回复.. 看来我必须四处阅读才能弄清楚这一点。如果您知道任何在线示例并提供链接,我将不胜感激。
    • 啊,我认为这就是他们在这一步中似乎正在做的事情。iphonesdkarticles.com/2009/01/…
    【解决方案3】:

    你可以试试:

    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
        return index;
    }
    

    如果没有控制器的其余部分,很难判断出了什么问题,但我认为应该可以。

    【讨论】:

    • 你的 tableview 是分组的还是普通的?
    • 简单,这是我问题中的屏幕截图..你认为是因为我有相同的价值观吗?
    • 应该分组以便调用section方法。
    • 谢谢,我现在正在调查这个 :) 谢谢你的帮助,一旦我有解决方案,我会更新我的帖子
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2010-11-07
    • 1970-01-01
    相关资源
    最近更新 更多