使UITableView可以通过索引滚动

C.J*_*hns 17 iphone indexing uitableview ios

我正在尝试创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

Lal*_*rya 43

你可以用它

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
Run Code Online (Sandbox Code Playgroud)

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

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

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

    NSMutableArray *alphabetsArray;
    NSMutableArray *dataArray; //--This contain your cell value i.e. Honda,Mazda--//
    
    Run Code Online (Sandbox Code Playgroud)
  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"];
    
    Run Code Online (Sandbox Code Playgroud)

    [ 注意:您还可以根据dataArray创建带动态包含的alphabetsArray.为此我们如何在下面创建动态部分索引标题数组 ]

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

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return alphabetsArray;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    [@"Honda",@"Maruti",@"Mazda",@"Toyota",.....]  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个创建动态部分索引标题数组的方法,如下所示

    - (void)createAlphabetArray;
    
    Run Code Online (Sandbox Code Playgroud)
  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];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在只需要在想要更改alphabetsArray包含的地方调用它

    [self createAlphabetArray]; 
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 返回0对我不起作用,所以我添加了返回1; 现在效果很好. (4认同)
  • @LalitKumar - 实际上,在某种意义上它确实很重要,如果你返回一个有效的段索引,那么`UITableView`将尝试滚动_itself_,从而否定手动滚动它的尝试.有必要从此函数返回一个与有效段索引不对应的值(或者根本不返回任何内容).我建议`NSNotFound`是在这种情况下使用的合理返回值. (3认同)
  • 为了澄清以上所有内容,您需要返回``sectionForSectionIndexTitle``中不存在的索引号.如果返回0(或存在的某个其他部分值),视图将滚动到该部分而不是您的选择. (2认同)

Dan*_*son 10

我认为表格视图需要按字母顺序分组 - 临时数组不知道如何将您选择的字母翻译成特定索引(它不知道"a","b"或"c"是什么意思).

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