0

私のアプリはCoreDataを使用しています。UISegmentedControlとテーブルビューがあります。UISegmentedControlは、さまざまな基準に基づいてテーブルビューを更新するために使用されます。

UISegmentedControlの最初のオプションは、すべてのデータを単一のテーブルビューセクションに表示します。だから私は-(NSFetchedResultsController *)fetchedResultsControllerで次のコードを使用します

frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                          managedObjectContext:[self managedObjectContext] 
                                          sectionNameKeyPath:nil
                                          cacheName:@"Root"];   

2番目のオプションは、複数のテーブルビューセクションにデータを表示します。したがって、NSSortDescriptorが必要で、sectionNameKeyPathを設定します。

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"city" 
                                                             ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSFetchedResultsController *frc = nil;
frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                          managedObjectContext:[self managedObjectContext] 
                                          sectionNameKeyPath:@"city" 
                                          cacheName:@"Root"];

sectionNameKeyPathは異なり、それぞれが異なるNSSortDescriptorを必要とするため、2つの異なるNSFetchedResultsControllerが必要であると想定します。

tableviewをリロードするために使用するコード:

- (void) touchDownAtSegmentIndex:(NSUInteger)segmentIndex{

NSPredicate *predicate;
NSError *error;    

[NSFetchedResultsController deleteCacheWithName:@"Root"];

if(segmentIndex == 0)
{

}
else if(segmentIndex == 1)
{

}
else
{
    return;
}

[[[self fetchedResultsController] fetchRequest] setPredicate:predicate];
[[self fetchedResultsController] performFetch:&error];
[[self tableView] reloadData];
}

誰でも、2つのNSFetchedResultsControllerを使用するコードのサンプルを提供できます。ありがとうございました。

解決:

@iTukkerのアイデアに加えて、戻る前にさらにチェックを追加しましfetchedResultsControllerた。このチェックを行わないと、このメソッドはステートメントfetchedResultsControllerを実行する代わりに戻ります。switch .. case ..

- (NSFetchedResultsController*)fetchedResultsController {

.....
    if ((fetchedResultsController!= nil) && [self.segmentChanged isEqualToString:@"false"])
    return fetchedResultsController;
.....

    if (frc == nil) {
        switch (segmentendControl.selectedSegmentIndex) {
           case 0: {
               frc = ... //first frc
               [frc retain];
               break;
           }
           case 1: {
               frc = ... //second frc
               [frc retain];
               break;
           }
        }
    }

....

}
4

1 に答える 1

0

frcがコントローラーのインスタンス変数であると仮定すると、次のようになります。

- (NSFetchedResultsController*)fetchedResultsController {
   if (frc == nil) {
      switch (segmentendControl.selectedSegmentIndex) {
         case 0: {
             frc = ... //first frc
             [frc retain];
             break;
         }
         case 1: {
             frc = ... //second frc
             [frc retain];
             break;
         }
      }
   }

   return frc;
}

そして、segmentedControllerの値が変更されたとき

[frc release];
frc = nil;
[tableView reloadData];

これが意味をなすといいのですが

于 2012-05-27T09:31:22.910 に答える