Последняя часть, чтобы решить переупорядочение UITableView, поддержанный головоломкой Core Data - PullRequest
0 голосов
/ 25 января 2011

Я пытаюсь изменить порядок UITableView в приложении для iOS.
После сбора большого количества вопросов StackOverFlow, я использовал это:

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    self.userDrivenDataModelChange = YES;

    NSUInteger fromIndex = fromIndexPath.row;  
    NSUInteger toIndex = toIndexPath.row;

    NSManagedObject *affectedObject = [self.fetchedResultsController.fetchedObjects objectAtIndex:fromIndex];  
    [affectedObject setValue: [NSNumber numberWithInt:toIndex] forKey:@"priority"];

    NSUInteger start, end;
    int delta;

    if (fromIndex < toIndex) {
        // move was down, need to shift up
        delta = -1;
        start = fromIndex + 1;
        end = toIndex;
    } else { // fromIndex > toIndex
        // move was up, need to shift down
        delta = 1;
        start = toIndex;
        end = fromIndex - 1;
    }

    for (NSUInteger i = start; i <= end; i++) {
        NSManagedObject *otherObject = [self.fetchedResultsController.fetchedObjects objectAtIndex:i];  
        NSNumber *oldPriority = (NSNumber *)[otherObject valueForKey:@"priority"];
        int tmp = [oldPriority intValue] + delta;
        NSNumber *newPriority = [NSNumber numberWithInt:tmp];
        [otherObject setValue: [NSNumber numberWithInt:[newPriority intValue]] forKey:@"priority"];        
    }


    NSError *error = nil;
    if (! [self.fetchedResultsController.managedObjectContext save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    // Should I call something here?

    self.userDrivenDataModelChange = NO;
}

После отправки сообщения сохранения в объект контекста, Что я долженвызов?какой-нибудь метод на контроллере выборки или табличном представлении?потому что он не работает в текущей форме.

Должен ли я отправлять сохранение в объект контекста в первую очередь?

Ответы [ 3 ]

0 голосов
/ 02 марта 2012

Вы также должны проверить, равны ли пути от и до индекса, если они есть, это приведет к сбою!

if([toIndexPath isEqual:fromIndexPath]) return;
0 голосов
/ 07 января 2015

// ВЫШЕ ОТВЕТ ПРАВИЛЬНО.ЗДЕСЬ БЫЛ ДРУГОЙ ПРАВИЛЬНО РАБОЧИЙ ПРИМЕР С МОИМИ СОБСТВЕННЫМИ ИМЕНАМИ ОБЪЕКТОВ

Прагма - Переупорядочивание

  • (BOOL) tableView: (UITableView *) tableView canMoveRowAtIndexPath :(NSIndexPath *) indexPath {return indexPath.section == 0 && indexPath.row

  • (void) tableView: (UITableView *) tableView moveRowAtIndexPath: (NSIndexPath *) sourceIndexPath toIndexPath: (NSIndexPath *) destinationIndexPath {

    NSInterowIndexdexdex от индекса;NSInteger toIndex = destinationIndexPath.row;

    Task * movingTask = [self.list.sortedTasks objectAtIndex: sourceIndexPath.row];Task * destinationTask = [self.list.sortedTasks objectAtIndex: destinationIndexPath.row];

    NSArray * tempList = self.list.sortedTasks;

    if (fromIndex == toIndex) {return;}

    // Переместить активную задачу в позицию целевой задачи.movingTask.order = destinationTask.order;NSLog (@ "moving% @ to% @", movingTask.details, movingTask.order);

    NSUInteger начало, конец;int order;

    if (fromIndex toIndex // перемещение было вверх, необходимо сдвинуть вниз на порядок = 1;start = toIndex;end = fromIndex - 1;}

    for (NSUInteger i = начало; i <= конец; i ++) {Task * otherObject = [tempList objectAtIndex: i];NSNumber * oldPriority = otherObject.order;int tmp = [oldPriority intValue] + order;NSNumber * newPriority = [NSNumber numberWithInt: tmp];otherObject.order = newPriority; </p>

    NSLog(@"moving %@ to %@", otherObject.details, otherObject.order);
    

    }

    [self.managedObjectContext save: nil];

}

0 голосов
/ 29 января 2011

Вы уже отправляете сообщение для сохранения в managedObjectContext, что нормально, if (! [self.fetchedResultsController.managedObjectContext save:&error]).

Чтобы увидеть обновленные результаты в табличном представлении, вероятно, будет достаточно вызвать [tableView reloadData]; в конце этого метода.

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