Как разделить UITableView на отношение Core Data? - PullRequest
1 голос
/ 20 июля 2010

У меня есть 2 сущности - BlogEntry и BlogComments.

BlogEntry.comments - это отношение "ко многим" к BlogComments

| BlogEntry     |
-----------------
| subject       |
| body          |
| comments (rel)|



| BlogComments   |
------------------
| commentText    |
| blogEntry (rel)|

Теперь у меня есть таблица, которой я хочу бытьвозможность иметь первую строку, являющуюся телом BlogEntry (текст), а остальные строки - BlogComments.Это возможно с NSFetchedResultsController?Могу ли я отказаться от таких отношений?Если это так, может кто-нибудь направить меня в правильном направлении?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2010

Используйте сгруппированные UITableView вместе с NSFetchedResultsController, который использует sectionNameKeyPath и NSPredicate:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"BlogComments" 
                                          inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

// Ensure we get a single blog entry and all it's associated comments
NSPredicate *predicate = 
                 [NSPredicate predicateWithFormat:@"blogEntryID=%@", blogEntryID];

[fetchRequest setPredicate:predicate];

NSString *key = @"blogEntry.subject";
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:key 
                                                               ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *aFetchedResultsController = 
         [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                             managedObjectContext:managedObjectContext
                                               sectionNameKeyPath:keycacheName:nil];

aFetchedResultsController.delegate = self;

Чтобы определить заголовок раздела, используйте свойство раздела fetchedResultsController:

- (NSString *)tableView:(UITableView *)tableView 
               titleForHeaderInSection:(NSInteger)section 
{
   if ([[fetchedResultsController sections] count] > section)
   {
    id <NSFetchedResultsSectionInfo> sectionInfo = 
                     [[self.fetchedResultsController sections] objectAtIndex:section];

       return [sectionInfo name];
    }
    return nil;
}

Чтобы определить количество строк в определенном разделе:

- (NSInteger)tableView:(UITableView *)tableView 
               numberOfRowsInSection:(NSInteger)section
{
    NSInteger numberofRows = 0;

    if ([[fetchedResultsController sections] count] > 0)
    {
        id <NSFetchedResultsSectionInfo> sectionInfo = 
                 [[fetchedResultsController sections] objectAtIndex:section];
        numberofRows = [sectionInfo numberOfObjects];
    }

    return numberofRows;
}

И, наконец, чтобы получить количество разделов в табличном представлении:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSUInteger count = [[fetchedResultsController sections] count];
    return count; 
}

В результате получается табличное представление с 1 разделом, представляющим запись блога и все связанные с ней комментарии блога в виде строк в tableView.

0 голосов
/ 20 июля 2010

Вы, вероятно, не хотите использовать NSFetchedResultsController.Он предназначен для простого отображения большого количества одного и того же управляемого объекта.У вас есть таблица, состоящая из двух управляемых объектов.

(здесь я предполагаю, что каждая таблица будет отображать только один пост в блоге с комментариями.)

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

В методе numberOfSectionsInTableView: вернуть 2. В numberOfRowsInSection: есть оператор switch.Если раздел равен нулю, верните 1 для записи в блоге.Если два, вернуть счетчик для массива комментариев.В cellForRowAtIndexPath: повторите переключатель, чтобы вернуть подходящую ячейку для любой секции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...