iPhone UITableView. How do turn on the single letter alphabetical list like the Music App?

后端 未结 9 899
再見小時候
再見小時候 2020-12-02 04:25

In the iPhone music app, selecting Artist, Songs, or Albums presents a tableView with a verticl list of single letters at the righthand side of the UI that enables rapid scr

相关标签:
9条回答
  • 2020-12-02 05:18

    A bunch of people asked if it was possible to do this without sections. I wanted the same thing and I found a solution which might be a little shady and doesn't return a value to sectionForSectionIndexTitle but if you are in a corner and don't want to have to make a section for every letter of the alphabet this is a sure fix. Sorry to any code Nazis in advance. :P

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        if (thisTableDataIsShowing)
        {
            NSMutableArray *charactersForSort = [[NSMutableArray alloc] init];
            for (NSDictionary *item in d_itemsInTable)
            {
                if (![charactersForSort containsObject:[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1]])
                {
                    [charactersForSort addObject:[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1]];
                }
            }
            return charactersForSort;
        }
        return nil;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
        BOOL found = NO;
        NSInteger b = 0;
        for (NSDictionary *item in d_itemsInTable)
        {
            if ([[[item valueForKey:@"character_field_to_sort_by"] substringToIndex:1] isEqualToString:title])
                if (!found)
                {
                    [d_yourTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:b inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
                    found = YES;
                }
            b++;
        }
    }
    

    It works great if you are getting a large amount of data and sectioning it would take a bunch of work. :) Tried to use generic variables so you knew what I was doing. d_itemsInTable is an NSArray of NSDictionaries that I'm listing out to the UITableView.

    0 讨论(0)
  • Something else you have to consider is localizing the sections for each language. After digging around a bit, I found UILocalizedIndexedCollation to be quite useful:

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section];
    }
    
    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
        return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index];
    }
    

    https://developer.apple.com/documentation/uikit/uilocalizedindexedcollation

    0 讨论(0)
  • 2020-12-02 05:24

    Supply your own index characters:

    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
        return[NSArray arrayWithObjects:@"a", @"e", @"i", @"m", @"p", nil];
    }
    

    and then:

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

    You will need sections.

    0 讨论(0)
提交回复
热议问题