Изменение Сортировки в NSFetchedResultsController на лету

К ответу benc's приложения , см. Стандартный ECMA-262. Это официальные зарезервированные слова, но только педант игнорирует реализацию для уважения стандарта. Для зарезервированных слов самых популярных реализаций, который является Firefox и Internet Explorer, см. ответ benc.

зарезервированные слова в EMCAScript-262 зарезервированное слово s, NullLiteral будущего Ключевого слова s, , и BooleanLiteral с, где эти Ключевые слова

break     do        instanceof  typeof
case      else      new         var
catch     finally   return      void
continue  for       switch      while
debugger  function  this        with
default   if        throw
delete    in        try

, будущее Зарезервированное слово †‹s

abstract  export      interface  static
boolean   extends     long       super
byte      final       native     synchronized
char      float       package    throws
class     goto        private    transient
const     implements  protected  volatile
double    import      public 
enum      int         short

, NullLiteral

null

и BooleanLiteral , с

true
false

17
задан aleclerc 11 November 2009 в 16:03
поделиться

2 ответа

Вместо использования NSFetchedResultsController в качестве источника данных представления таблицы, создайте NSArray, который вы устанавливаете, когда пользователь изменяет порядок сортировки с вашим сегментированным элементом управления, основываясь на содержимом массива на полученных результатах. Затем просто выполните сортировку, используя стандартную сортировку массивов. Примерно так:

- (IBAction)segmentChanged:(id)sender
{
    // Determine which segment is selected and then set this 
    // variable accordingly
    BOOL ascending = ([sender selectedSegmentIndex] == 0);

    NSArray *allObjects = [fetchedResultsController fetchedObjects];

    NSSortDescriptor *sortNameDescriptor = 
                       [[[NSSortDescriptor alloc] initWithKey:@"name" 
                                 ascending:ascending] autorelease];

    NSArray *sortDescriptors = [[[NSArray alloc] 
                     initWithObjects:sortNameDescriptor, nil] autorelease];

    // items is a synthesized ivar that we use as the table view
    // data source.
    [self setItems:[allObjects sortedArrayUsingDescriptors:sortDescriptors]];

    // Tell the tableview to reload.
    [itemsTableView reloadData];    
}

Итак, описатель сортировки, который я использовал, называется "имя", но вы бы изменили это на имя поля, по которому хотите отсортировать результаты в полученных результатах. Кроме того, элементы ivar, на которые я ссылался, будут вашим новым источником данных табличного представления. Теперь делегаты представления таблицы будут выглядеть примерно так:

- (NSInteger)tableView:(UITableView*)tableView 
 numberOfRowsInSection:(NSInteger)section
{
    return [items count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get your table cell by reuse identifier as usual and then grab one of
    // your records based on the index path
    // ...

    MyManagedObject *object = [items objectAtIndex:[indexPath row]];

    // Set your cell label text or whatever you want 
    // with one of the managed object's fields.
    // ...

    return cell;
}

Не уверен, что это лучший способ, но он должен работать.

8
ответ дан 30 November 2019 в 11:04
поделиться

fetchRequest - свойство только для чтения. Строка кода в вашем сообщении не будет работать. Если вы хотите использовать другой запрос на выборку, вам необходимо заменить свой контроллер новым NSFetchedResultsController . Ваш стол не будет перезагружен автоматически. Вам нужно будет отправить ему сообщение reloadData через некоторое время после того, как вы замените NSFetchedResultsController .

2
ответ дан 30 November 2019 в 11:04
поделиться