Добавляйте новые записи в контроллер табличного представления в верхней части таблицы с каждой новой записью.

У меня есть рабочее приложение, которое в основном состоит из следующего:

Используя Core Data, у меня есть 1 контроллер представления таблицы с кнопкой «Добавить», которая модально вызывает новый контроллер представления, предлагая пользователю добавить текст в три поля. Когда пользователь нажимает «Сохранить», запись добавляется в контроллер табличного представления в виде ячейки подзаголовка с заполненной информацией. Это работает хорошо.

Что меня смущает и что я искал ответы, так это тот факт, что каждая новая запись добавляется в нижнюю часть ячеек, поэтому, если ячеек достаточно для заполнения экрана, новая добавленная запись добавляется в нижнюю часть. Мне бы очень хотелось, чтобы каждая новая запись находилась в верхней части ячейки таблицы.

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

Мой FetchRequest в настоящее время выглядит так:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Transaction"];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"whoBy.name" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

self.transactions = [[managedObjectContext executeFetchRequest:fetchRequest error:nil]mutableCopy];

Это код, который добавляет записи в базу данных:

NSManagedObject *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
[person setValue:self.nameTextField.text forKey:@"name"];

[transaction setValue:person forKey:@"whoBy"];

Любые мысли будут оценены!


person amitsbajaj    schedule 14.10.2013    source источник


Ответы (3)


Вы также можете получить ответы в разделе «По убыванию по запросу на выборку Coredata».

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"date" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entityDesc];

[fetchRequest setFetchBatchSize:10];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];    

[fetchRequest setSortDescriptors:sortDescriptors];

NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
person Pradhyuman sinh    schedule 14.10.2013
comment
Есть ли в вашем основном объекте данных поле даты или отметки времени? если да, то используйте этот код, чтобы получить объект в порядке убывания добавленных вами объектов в сущность, а если нет, то вы можете добавить поле метки времени. - person Pradhyuman sinh; 15.10.2013
comment
Эй, приятель, спасибо за комментарий. У меня есть атрибут отметки времени (поле), который я могу использовать. Как будет выглядеть код, чтобы это отображалось в порядке создания в соответствии с меткой времени? также, как бы я поместил это в разделы (еще не используя NSFetchedResultsController). - person amitsbajaj; 16.10.2013
comment
эй, используйте тот же код выше, просто измените дату имени объекта с помощью поля метки времени - person Pradhyuman sinh; 16.10.2013
comment
Спасибо, чувак, следил за этим, но порядок не меняется. Я думаю, потому что у меня нигде нет кода, чтобы атрибут даты действительно что-то делал? Куда бы я это поместил и что именно я бы поставил? Я не прошу пользователя вводить дату, я просто хочу использовать атрибут даты в качестве даты создания, то есть дату ее создания. - person amitsbajaj; 16.10.2013
comment
На самом деле, я действительно хотел бы изменить это. Я создам текстовое поле для пользовательского интерфейса, чтобы пользователь мог выбрать дату (год, месяц и т. д.), и я хочу, чтобы это было основой поиска. Ячейка табличного представления не должна отображать дату, но я хочу, чтобы записи были упорядочены таким образом... а затем, в конечном итоге, использовать сектины - person amitsbajaj; 16.10.2013

вы можете вставить новую запись на место с помощью

 [self.tableview insertRowsAtIndexPaths:indexPath withRowAnimation:YES ];

А также вы можете сделать это, обновив свой массив.

You can add object to as:

 [yourArray insertObject:object atIndex:0]; //for first row.

Затем перезагрузите таблицу с новым массивом:

 [yourTable reloadData]

это сработает для вас.

person Pradhyuman sinh    schedule 14.10.2013
comment
Спасибо, Прадхьюман, это очень полезно. К какому методу я бы добавил этот код? Кроме того, в [yourArray insertObject объект будет управляемым ObjectContext или записью в каждой строке. Извините, просто немного запутался с этим! Новичок в разработке! - person amitsbajaj; 14.10.2013
comment
вы вызываете новый контроллер представления при нажатии кнопки «Добавить»? - person Pradhyuman sinh; 14.10.2013
comment
Итак, для этого вы добавляете представление как подвид или вызываете метод pushViewController? - person Pradhyuman sinh; 14.10.2013
comment
На самом деле я не вызываю метод pushViewController. Кнопка добавления была добавлена ​​в раскадровку и разделена (модально) в раскадровке, поэтому у меня есть еще один контроллер представления, который представляет контроллер модального представления, который добавляет данные; это все работает, и я не передаю никакой информации. Из контроллера представления добавления записи я добавляю все в объект основных данных, а затем из этого TableView я просто загружаю записи - person amitsbajaj; 14.10.2013
comment
хорошо, затем перезагрузите UItableview в методе viewWillAppear и получите данные из ваших объектов coreData. - person Pradhyuman sinh; 14.10.2013
comment
Спасибо, Прадхьюман, это именно то, что я делаю, и здесь это работает как шарм... но записи добавляются внизу табличного представления.. Я хочу добавить их вверху, используя предоставленный вами код - будет ли это также в методе viewWillAppear? - person amitsbajaj; 14.10.2013
comment
если вы все еще получаете новый добавленный объект внизу, то одно дело - просто изменить порядок вашего массива - person Pradhyuman sinh; 14.10.2013
comment
С помощью этого кода ваш массив будет переупорядочен, и вы получите свой недавно добавленный объект в первую очередь. Сначала получите данные в NSMutableArray и переверните объекты вашего массива, используя приведенный ниже код: reversedArray = [[theMutableArray reverseObjectEnumerator] allObjects]; - person Pradhyuman sinh; 14.10.2013
comment
и не забудьте написать [yourtable reloadData]; метод - person Pradhyuman sinh; 14.10.2013
comment
Спасибо - я все еще не мог заставить это работать с reverseObject и т. Д. Я не могу представить, что это слишком сложно, чтобы новые записи добавлялись вверху. Я думаю, что где-то просто отсутствует какой-то параметр, потому что я могу сделать список в ALphabetical заказать и нет..? - person amitsbajaj; 14.10.2013
comment
Я обновил основной вопрос, включив в него код, добавляющий записи в базу данных. Возможно, мне нужно добавить их в другом порядке? - person amitsbajaj; 14.10.2013
comment
Любые дальнейшие мысли? - person amitsbajaj; 14.10.2013

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

В Add Entry View Controller (контроллер представления, который добавляет записи в базу данных и имеет метод кнопки сохранения) я сделал следующее:

1) Я добавил в класс свойство (@property (nonatomic, strong) NSDate *dateToday; 2) В методе сохранения я сделал следующее:

self.dateToday = [NSDate date]; 
[transaction setValue:self.dateToday forKey:@"createdDate"];
// transaction is looking into the Transaction Entity which has an attribute called createdDate of type Date. 

3) В TableViewController и с помощью NSFetchRequest я сделал следующее:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"createdDate" ascending:NO]; 
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
[fetchRequest setSortDescriptors:sortDescriptors];

Итак, теперь, когда я создаю новую запись, поскольку для параметра «По возрастанию» установлено значение «НЕТ», вновь созданная запись находится в верхней части контроллера представления таблицы.

Спасибо за ваше руководство @Pradhyuman Chavda

person amitsbajaj    schedule 16.10.2013
comment
Нет, брат, большое тебе спасибо за помощь. Действительно помог мне прогрессировать! - person amitsbajaj; 16.10.2013