위의 Marcus의 가이드 라인을 사용하여 다음과 같이 구현했습니다 (새로운 접근 방식이므로 최선의 방법이 아닐 수 있습니다). 나는 'open', 'in progress'및 'closed'에 대한 세 가지 옵션을 가진 세그먼트 컨트롤러를 가지고있다.
ViewController.h에서 세그먼트 옵션 각각에 대해 iVar를 만들고 현재 컨트롤러를 저장할 주 컨트롤러에 대해 하나의 iVar를 만듭니다.
@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *inprogressFetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *openFetchedResultsController;
@property (nonatomic, retain) NSFetchedResultsController *closedFetchedResultsController;
ViewController.m에서 이러한 컨트롤러의 지연로드를위한 메소드를 만들어야하므로 총 3 개가 있습니다. 그들은 술어와 cacheName을 제외하고는 기본적으로 같습니다. 아래에 하나만 보여 줬습니다.
- (NSFetchedResultsController *)closedFetchedResultsController
{
if (_closedFetchedResultsController != nil) {
return _closedFetchedResultsController;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ticket" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];
// Edit the sort key as appropriate.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"priority.name" ascending:NO];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status = 'Closed'"];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"priority.name" cacheName:@"ClosedTickets"];
aFetchedResultsController.delegate = self;
self.closedFetchedResultsController = aFetchedResultsController;
NSError *error = nil;
if (![self.closedFetchedResultsController performFetch:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _closedFetchedResultsController;
}
변경 될 때 가져온 결과 컨트롤러를 변경하고 테이블을 다시로드하도록 세그먼트에 대한 IBAction을 만듭니다.
- (IBAction)statusChanged:(id)sender {
switch (self.segmentControl.selectedSegmentIndex) {
case 0:
self.fetchedResultsController = self.inprogressFetchedResultsController;
break;
case 1:
self.fetchedResultsController = self.openFetchedResultsController;
break;
case 2:
self.fetchedResultsController = self.closedFetchedResultsController;
break;
default:
break;
}
[self.tableView reloadData];
}
그게 전부 야!
N.B. 또한이 행을 내 ViewDidLoad 메서드에 추가하여 처음에는 올바른 옵션을 fetchedResultsController에로드했습니다.
self.fetchedResultsController = self.inprogressFetchedResultsController;
나는 당신이 이미 커뮤니티에 너무 많은 것을주는 누군가와 마찬가지로, 나는 당신이 나의 것과 같은 질문에 대답 할 수있는 시간을 갖는 것을 절대적으로 놀라게합니다. 백만 달러 감사합니다! –
Marcus, 이것을 구현하는 가장 깨끗한 방법은 무엇입니까? 세 개의 세그먼트가 있다면 세 개의 FRC가 필요하며 tableview 코드에 모든 switch() case : 문을 포함시키는 것은 그리 좋지 않을 것입니다. 아마도 개별 세그먼트에 해당하는 레이블을 사용하여 'typedef enum'을 만든 다음 적절한 인덱스의 클래스에있는 NSArray에 FRC를 추가하십시오. 그렇다면'switch() case'가있을 곳에'[self.frcArray objectAtIndex : [segControl selectedSegmentIndex]]'와 같은 것을 참조하면됩니다. 아니면 더 깨끗한 방법이 있을까요? –
은 그것들을 iVars로 가지고 있고 'currentFRC' iVar를 가지고있다. 세분화 된 컨트롤을 탭하면 'currentFRC'가 가리키는 것을 전환하고 tableView에 다시로드하도록 지시합니다. 다른 모든 것은'currentFRC'와 대화하고 여러분의 델리게이트 메소드에 체크를해서'currentFRC'가 아닌 어떤 메시지도 무시합니다. –