My Core Data模型如下所示:
实体players
的{{1}}关系是到多个关系,并且将包含与该Game
实体相关的所有player
个对象
我的Game
看起来像this < - link 。
表格视图显示所有游戏,我将如何,选择游戏时显示/推送另一个UITableView以显示UITableView
关系中的所有玩家。
我已经尝试了这一点,但无济于事,我认为我走在正确的轨道上,但却被许多我无法解决的错误所困扰。
答案 0 :(得分:2)
只需创建另一个UITableViewController
子类,将其包装到导航控制器中并推送。请务必使用NSFetchedResultsController
填充表格视图。您应该将Game对象传递给第二个表视图控制器,以便为它构建谓词。
一些代码段:
将视图控制器包装到表视图控制器的tableView:(UITableView *)tableView didSelectRowAtIndexPath:
方法中的导航中。
TagsViewController *tagsViewController = [[TagsViewController alloc] initWithMode:TagsViewControllerModeSelect]; // You can view plain style, I've just created my initializer
tagsViewController.unit = self.unit; // You can pass the Game here
[self.navigationController pushViewController:tagsViewController animated:YES];
[tagsViewController release];
这里是获取结果controller lazy initializer
- (NSFetchedResultsController*)fetchedResultsController
{
if(fetchedResultsController != nil)
return fetchedResultsController;
NSEntityDescription* entity = [NSEntityDescription entityForName:@"StudyUnit" inManagedObjectContext:managedObjectContext];
NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
NSString *predicateString = [[DefaultsManager sharedInstance] filterMode] == kFilterModeShowAll ? @"explanation != '' AND show == YES" : @"ANY tag.show == YES AND explanation != '' AND show == YES";
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; // Here goes your predicate to query players for particular game
[fetchRequest setPredicate:predicate];
NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc] initWithKey:@"subject" ascending:YES];
NSArray* sortArray = [[NSArray alloc] initWithObjects:sortByWordDescriptor, nil];
[fetchRequest setSortDescriptors:sortArray];
NSFetchedResultsController* controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Hmm"];
controller.delegate = self;
self.fetchedResultsController = controller;
[fetchRequest release];
[sortByWordDescriptor release];
[sortArray release];
[controller release];
return fetchedResultsController;
}
然后只需实施NSFetchedResultsController
个代表,发送performFetch
个消息,然后瞧!
UPD:
假设您的游戏对象通常在第二个控制器中声明为NSManagedObject
:
NSManagedObject *game;
然后你可以建立这样的谓词:
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext];
//...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"game == %@", self.game];
这只是理论上的,不能测试对不起^^
答案 1 :(得分:2)
在第二个tableView中,因为你已经有了游戏对象,所以你真的不需要另一个NSFetchedResultsController
。您可以直接从注入第二个视图控制器的游戏对象中获取玩家,并使用关系显示玩家。
如果您希望玩家在用户查看第二个控制器时进行更改,则只需要在此情况下使用第二个NSFetchedResultsController
。否则只需走完这段关系就足够了,并且会使用更少的内存/ CPU。