Получение разделов UITableView из NSFetchedResultsController с использованием отношения «ко многим» - PullRequest
5 голосов
/ 01 декабря 2011

Моя базовая модель данных выглядит следующим образом:

article <--->> category

Можно ли даже удаленно использовать NSFetchedResultsController для создания UITableView, который выглядит примерно так?

Category 1
  - Article A
  - Article B
  - Article C
Category 2
  - Article A
  - Article D
  - Article E
  - Article F
Category 3
  - Article B
  - Article C

В частности, меня интересует случай (ребро?), Где каждый раздел UITableView имеет уникальный заголовок (например, «Категория 1», «Категория 2»), но один и тот же объект может существовать в нескольких разделах (например, Статья А существует как в категории 1, так и в категории 2).

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

Ответы [ 2 ]

9 голосов
/ 01 декабря 2011

Да, это легко, хотя есть миллион способов сделать это.

Ваш контроллер представления должен быть "источником данных" UITableView и возвращает информацию о количестве строка затем содержимое каждой отдельной строки.

В табличном представлении есть понятие "раздел", вы можете выбрать один для каждой категории.

Например, вы можете создатьNSFetchedResultsController, чтобы найти категории, которые вы хотите отобразить, и использовать их для заполнения разделов табличного представления, и тогда каждая категория будет иметь отношение статей ко многим для заполнения строк в каждом разделе.

Примерно так должно начаться (при условии, что ваши категории и сущности статьи содержат свойство title):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   // return the number of categories
    [[self.categoryResultsController fetchedObjects] count];
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
  // return the title of an individual category
    [[self.categoryResultsController.fetchedObjects objectAtIndex:section] valueForKey:@"title"];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
  // return the number of articles in a category
  MyCategory *category = [self.categoryResultsController.fetchedObjects objectAtIndex:section];

  return category.articles.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  // fetch a cached cell object (since every row is the same, we re-use the same object over and over)
    static NSString *identifier = @"ArticleCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }

    // find the category and article, and set the text of the cell
    MyCategory *category = [self.categoryResultsController.fetchedObjects objectAtIndex:indexPath.section];

    cell.textLabel.text = [[category.articles objectAtIndex:indexPath.row] valueForKey:@"title"];

    return cell;
}

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

0 голосов
/ 01 декабря 2011

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

Что вы могли бы сделать:

  1. Выполните запрос на выборку для всех category и поместите их в NSArray. Это будут ваши разделы.
  2. Для счетчика секций вернуть счет category '
  3. Для подсчета строк вернуть счет self.category.articles

Вот пример кода для шага 2 + 3

// 2
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;
{
    return [self.categories count];
}

// 3
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
    return [[[self.categories objectAtIndex:section] articles] count];
}
...