Как я могу вставить новые объекты в UITableView, поддерживаемые Core Data / NSFetchedResultsController? - PullRequest
1 голос
/ 29 июля 2010

У меня есть табличное представление, которое успешно включает NSFetchedResultsController.Однако мне нужна верхняя ячейка в моем табличном представлении, чтобы прочитать «Добавить новый объект» и иметь UITableViewCellEditingStyleInsert вместо UITableViewCellEditingStyleDelete по умолчанию.

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

ОБНОВЛЕНИЕ:

Для тех, кому может быть интересноЧто касается решения, которое я выбрал, я решил, что вставная ячейка должна быть снизу, а не сверху.Вот соответствующий код:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    //self.clearsSelectionOnViewWillAppear = NO;

    self.editing = YES;
    self.tableView.allowsSelectionDuringEditing = YES;
    self.tableView.delegate = self;

    RubricAppDelegate *appDelegate = (RubricAppDelegate *)[[UIApplication sharedApplication] delegate];
    managedObjectContext = [appDelegate managedObjectContext];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"myClass" inManagedObjectContext:managedObjectContext];
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
    [request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"classID" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];

    fetchedResultsController = [[NSFetchedResultsController alloc]
                                               initWithFetchRequest:request 
                                               managedObjectContext:self.managedObjectContext
                                               sectionNameKeyPath:nil cacheName:nil];
    NSError *error;
    [fetchedResultsController performFetch:&error];

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"Number of sections = %d", [[fetchedResultsController sections] count]);

    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    id <NSFetchedResultsSectionInfo> myClass = [[fetchedResultsController sections] objectAtIndex:section];
    NSLog(@"Number of classes = %d", [myClass numberOfObjects]);

    return ([[fetchedResultsController fetchedObjects] count] + 1);

}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    NSLog(@"FRC count + 1 = %d", ([[fetchedResultsController fetchedObjects] count] + 1));

    if (indexPath.row == ([[fetchedResultsController fetchedObjects] count])) {
        cell.textLabel.text = @"Add New Class";
    }
    else {
        myClass *theClass = [fetchedResultsController objectAtIndexPath:indexPath];
        NSLog(@"Class name is: %@", theClass.classTitle);
        cell.textLabel.text = theClass.classTitle;
    }


    return cell;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row == [[fetchedResultsController fetchedObjects] count]) {
        return UITableViewCellEditingStyleInsert;
    }
    return UITableViewCellEditingStyleDelete;
}

Результат (с некоторыми нежелательными данными):

alt text

Теперь моя единственная проблема - заставить работать функции удалениядолжным образом.Вы можете следить за моим постом по этому вопросу здесь

1 Ответ

2 голосов
/ 29 июля 2010

Обычно строка добавления находится внизу.

Это можно сделать, изменив методы -tableView:numberOfRowsInSection: и -tableView:cellForRowAtIndexPath:, чтобы настроить количество ячеек и настроить его.Таким образом, ваш -tableView:numberOfRowsInSection: вернет N + 1, а ваш -tableView:cellForRowAtIndexPath: получит объект в N-1, если только N == 0, а затем вернет вашу ячейку "Добавить новый объект".

Нет необходимостисвязываться с базовыми элементами Core Data, так как это строго проблема пользовательского интерфейса.

Обновление

Но теперь я не уверен, как вернуть счетчик моих выбранных объектов (предполагая, чтоэто то, что я использовал для "N" в вашем ответе выше).Кроме того, я бы не хотел, чтобы -tableView: cellForRowAtIndexPath возвращал мою ячейку «Добавить новый объект», когда indexPath.row = (N + 1), а не N = 0?Возможно, я неправильно понимаю, что означает «N», но я подумал, что это просто означает количество выбранных объектов.

Да, это количество реальных объектов.

Вы хотите, чтобы ваш -tableView:cellForRowAtIndexPath: возвращал ячейку для вашего "Добавить новый объект", иначе какой смысл?Вы просто хотите, чтобы он возвращал другой тип ячейки.

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

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