使UITableView可以通过索引滚动

时间:2011-09-13 21:04:24

标签: iphone ios uitableview indexing

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

screenshot

我想知道我是否遗漏了一些东西,所以我想知道是否还有别的东西需要做,或者其他的事情。

#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;
}

3 个答案:

答案 0 :(得分:43)

您可以使用此

- (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;
    }
    
  5. ****我们如何创建动态部分索引标题数组****

    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. 现在只要在想要更改alphabetsArray包含

      的任何地方调用它
      [self createAlphabetArray]; 
      
    5. 现在,您可以根据dataArray内容动态创建动态节索引标题数组。

答案 1 :(得分:10)

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

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

答案 2 :(得分:2)

您可以尝试:

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

没有控制器的其余部分很难说出错了,但我认为这应该有用。