Make UITableView scrollable by index

后端 未结 3 1922
长情又很酷
长情又很酷 2020-12-13 10:44

I am trying to create a UITableView index for faster scrolling of a large UITableView, I have the index showing up on the right but when I try to s

3条回答
  •  时光取名叫无心
    2020-12-13 11:04

    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))

    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:

    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 viewDidLoad method 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 alphabetsArray with dynamic contains according to your dataArray. For this follow How we can create dynamic section index titles array at 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;
      }
      

    ****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 createAlphabetArray method 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]; 
      

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

提交回复
热议问题