ios 使 UITableView 可按索引滚动

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7408474/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 21:30:22  来源:igfitidea点击:

Make UITableView scrollable by index

iphoneiosuitableviewindexing

提问by C.Johns

I am trying to create a UITableViewindex for faster scrolling of a large UITableView, I have the index showing up on the right but when I try to scroll with it, it does not work..

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

screenshot

截屏

I am wondering if I have missed something so I am wondering if there is something else I have to do, or something along those lines.

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

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

采纳答案by Daniel G. Wilson

The table view needs to be grouped alphabetically I believe - The temp array doesn't know how to translate the letter that you select into a specific index (it doesn't know what "a", "b", or "c" mean).

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

If you take a look at the ipod song list, you'll notice that each letter group has a letter section divider. You'll need to group your table objects into sections titled with letters in order to translate the letter "A" to an index. What apple's ipod list is actually doing is not scrolling to the first "A" entry, but the beginning of the "A" section.

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

回答by Lalit Kumar Maurya

You can use this

你可以用这个

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

Which tells the table which section corresponds to section title/index (e.g. "B",1))

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

This method is for returning a section corresponding to a Title. But you want to scroll your single section's row according to these titles. So follow these steps:

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

  1. Create global array means declare it in .h file

    NSMutableArray *alphabetsArray;
    NSMutableArray *dataArray; //--This contain your cell value i.e. Honda,Mazda--//
    
  2. Define it in viewDidLoadmethod like below then return it from UITableView method..

    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"];
    

    [Note:You can also create alphabetsArraywith dynamic contains according to your dataArray. For this follow How we can create dynamic section index titles arrayat below]

  3. Now use the above mentioned method to get the title

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return alphabetsArray;
    }
    
  4. Write your logic to scroll the 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. 创建全局数组意味着在 .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"];
    

    [注意:您还可以根据您的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;
    }
    

****How we can create dynamic section index titles array****

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

  1. Let us suppose that dataArray is like that

    [@"Honda",@"Maruti",@"Mazda",@"Toyota",.....]  
    
  2. Create a method for creating dynamic section index titles array as below

    - (void)createAlphabetArray;
    
  3. Implements createAlphabetArraymethod as below

    #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. Now just call it anywhere when you want to change alphabetsArray contains

    [self createAlphabetArray]; 
    
  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]; 
    

Now you can create dynamic section index titles array dynamically according to your dataArray contents.

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

回答by Evan Cordell

You might try:

你可以试试:

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

It's hard to tell what's wrong without the rest of your controller, but I think that should work.

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