Как создать индекс UITableView для больших наборов данных - PullRequest
2 голосов
/ 20 сентября 2011

Я спустился по кроличьей норе с индексированными, секционированными табличными представлениями и попал в поездку, из-за которой мне захотелось повредить много ценных предметов в моей комнате ... Я надеюсь, что еще один последний ясный вопрос:кто-то сможет помочь мне решить эту проблему в ходе продолжающейся борьбы.

Я собираюсь начать с самого начала, чтобы не путать кого-либо, кто предлагает свою помощь, я думаю, что так проще, и, надеюсь, кто-то может опубликовать какую-то честную статью.достойные примеры для меня, чтобы читать / использовать, как и в предыдущих вопросах, я думаю, что предоставил много подробностей и запутал всех, где запрос на самом деле прост ... его реализация протягивается и зависит от того, какие данные вы получаете и как.

Хорошо, мы идем.

У меня есть UITableView, который при открытии запрашивает мою базу данных на предмет списка производителей автомобилей, я анализирую поступающий XML и остаюсь с несортированным спискомПроизводители автомобилей, затем я передаю этот NSArray в пользовательский метод, который затем сортируетit AZ.

- (IBAction)startSortingTheArray:(NSMutableArray *)arrayData
{
    //Sort incoming array alphabetically
    [self setSortedArray:[arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]];

Здесь я хотел бы узнать, как создать индексированное представление UITableview для индексной прокрутки большой базы данных. << ---- <strong>Это мой вопрос

Вот что я знаю, С этого момента мне нужно создать массив букв, которые представляют буквы алфавита, которые находятся в моих данных (то есть) первой букве каждого значения в моем отсортированном массиве.Мне также нужно создать NSDictionary с моими отсортированными массивами, разделенными на разделы с этим словарем.

Оттуда мне нужно обновить некоторые из моих методов делегата UItableview, чтобы они могли обрабатывать NSDictionary, разделы и т. Д. ОттудаМне нужно передать значения в моем NSDictionary меткам UItableviewcell ...

Во всех предыдущих попытках я дошел до того, что у меня есть все, но на самом деле я могу отображать данные в ячейках таблицы,но потому что он был составлен путем чтения нескольких различных руководств, он просто не работает.Поэтому я решил, что теперь я действительно знаю, что должно произойти, может быть, кто-то будет достаточно любезен, чтобы поделиться своим кодом аналогичной проблемы, из которой я смогу выучить и, надеюсь, научиться делать это на самом деле ...

Я хотел бы поблагодарить всех, кто помог мне до сих пор, и всех, кто собирается помочь мне в будущем: PI обязательно опубликует мое окончательное решение с комментариями, чтобы, надеюсь, предотвратить это с кем-либо еще в будущем!Я не могу помочь, но чувствую небольшую ненависть к яблоку за этот рассол реализации.

Honda,
    Honda,
    Honda,
    Honda,
    Honda,
    Honda,
    Honda,
    Mazda,
    Mazda,
    Mitsubishi,
    Mitsubishi,
    Mitsubishi,
    Mitsubishi,
    Mitsubishi,
    Mitsubishi,
    Nissan,
    Nissan,
    Nissan,
    Nissan,
    Nissan,
    Nissan,
    Nissan,
    Toyota,
    Toyota,
    Toyota

1 Ответ

2 голосов
/ 20 сентября 2011

После прочтения вашего вопроса звучит так, будто вы хотите создать секцию UITableView на основе большой базы данных.Сколько разделов вы думаете?Он может обрабатывать столько, сколько вы хотите, но есть некоторые функции, которые вы не сможете использовать, например, index -ing может быть не очень хорошо, если у вас более 100 разделов.(На самом деле, я думаю, что на это может быть ограничение, но я не уверен.)

В данном случае проще всего было бы иметь массив массивов.Массив будет содержать массив для каждого раздела.Так что это будет что-то вроде:

@interface myTableView: UITableViewController {
  NSMutableArray * arrayOfSection;
  NSMutableArray * sectionHeaders;
}

@implementation myTableView

// Note I will assume that arrayData contains only NSStrings.
- (void)sortSectionsWithArray:(NSMutableArray *)arrayData; {
  NSMutableArray * alphabet = [[NSMutableArray alloc] initWithObjects:@"A", @"B", ..., @"Y", @"Z", nil];
  NSString * firstLetter;
  for(NSString * string in arrayData){
    firstLetter = [string substringToIndex:1];
    for(NSString * sectionString in alphabet){
      if([firstLetter isEqualToString:sectionString]){
        [alphabet removeObject:sectionString];
        break;
      }
    }
  }
  // Note that whatever is left over are the letters of the alphabet that are NOT section headers, as we removed the section headers strings.
  // Therefore, if we remove the letters stored in the alphabet array, we have the remaining section headers!
  if(sectionHeaders){
    [sectionHeaders release];
  }
  sectionHeaders = [[NSMutableArray alloc] initWithObjects:@"A", @"B", ..., @"Y", @"Z", nil];
  for(NSString * string in sectionHeaders){
    for(NSString * sectionString in alphabet){
      if([string isEqualToString:sectionString]){
        [sectionHeaders removeObject:string];
        break;
      }
    }
  }
}

// Assume that the array below is your input array:
// NSArray * arrayData = [[NSArray alloc] initWithObjects:@"Honda", @"Honda", @"Mazda", @"Mazda", @"Mitsubishi", @"Mitsubishi", @"Nissan", @"Nissan", @"Toyota", @"Toyota", nil];
- (void)startSortingTheArray:(NSMutableArray *)arrayData; {
  if(arrayOfSection){
    [arrayOfSection release];
  }
  arrayOfSection = [[NSMutableArray alloc] initWithCapacity:[sectionHeaders count]];
  NSMutableArray * section;
  for(NSString * string in sectionHeaders){
    section = [[NSMutableArray alloc] init];
    for(NSString * dataString in arrayData){
      if([string isEqualToString:[dataString substringToIndex:1]]){
        [section addObject:dataString];
      }
    }
    [arrayOfSection addObject:section];
    [section release];
  }
}

Тогда в ваших UITableViewDelegate методах используйте:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; {
  return [arrayOfSection count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; {
  return [[arrayOfSection objectAtIndex:section] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; {
  static NSString * CellIdentifier = @"TableViewCell";
  UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
  if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
  }
  // Set model saved in arrayOfSection by using: [[arrayOfSection objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
  return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath; {
  // What you want the view controller to do when a row is selected.
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; {
  return [sectionHeaders objectAtIndex:section];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; {
  return sectionHeaders;
}

- (void)dealloc; {
  [arrayOfSection release];
  [sectionHeaders release];
  [super dealloc];
}

Надеюсь, что поможет!

...