I have spent several days looking for information relating to this, and will share with you my own experience. I am also trying to create a game that loads into a UITableViewController, from which the CCDirector is loaded when a cell is touched. This is a Game Center turn-based game, hence the design (think Words With Friends). The best approach I have found so far for this is as follows (note I'm working in 2.0 - where CCDirector is a UIViewController subclass):
In AppDelegate.h, create a new ivar to hold the CCGLView that is created from the template code. Then assign the CCGLView created in didFinishLaunching to your new ivar. This allows the director to reuse the originally created view instead of trying to recreate it every time you reload the CCDirector, which seems to cause all sorts of weird issues in my experience.
You also want to create a new method in AppDelegate called -setupDirector or something of the like where you will, well, setup the director. This should be called each time you are recreating the CCDirector. I have posted my version below. Note my ivar for the CCGLView is called "GLView".
- (void)setupDirector {
if (![CCDirector sharedDirector]) {
CCLOG(@"Calling setupDirector");
director_ = (CCDirectorIOS*) [CCDirector sharedDirector];
director_.wantsFullScreenLayout = YES;
// Display FSP and SPF
[director_ setDisplayStats:NO];
// set FPS at 60
[director_ setAnimationInterval:1.0/60];
// attach the openglView to the director
[director_ setView:GLView];
// for rotation and other messages
[director_ setDelegate:self];
// 2D projection
[director_ setProjection:kCCDirectorProjection2D];
// [director setProjection:kCCDirectorProjection3D];
// Enables High Res mode (Retina Display) on iPhone 4 and maintains low res on all other devices
if( ! [director_ enableRetinaDisplay:YES] )
CCLOG(@"Retina Display Not supported");
// Default texture format for PNG/BMP/TIFF/JPEG/GIF images
// It can be RGBA8888, RGBA4444, RGB5_A1, RGB565
// You can change anytime.
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA8888];
// If the 1st suffix is not found and if fallback is enabled then fallback suffixes are going to searched. If none is found, it will try with the name without suffix.
// On iPad HD : "-ipadhd", "-ipad", "-hd"
// On iPad : "-ipad", "-hd"
// On iPhone HD: "-hd"
CCFileUtils *sharedFileUtils = [CCFileUtils sharedFileUtils];
[sharedFileUtils setEnableFallbackSuffixes:NO]; // Default: NO. No fallback suffixes are going to be used
[sharedFileUtils setiPhoneRetinaDisplaySuffix:@"-hd"]; // Default on iPhone RetinaDisplay is "-hd"
[sharedFileUtils setiPadSuffix:@"-ipad"]; // Default on iPad is "ipad"
[sharedFileUtils setiPadRetinaDisplaySuffix:@"-ipadhd"]; // Default on iPad RetinaDisplay is "-ipadhd"
// Assume that PVR images have premultiplied alpha
[CCTexture2D PVRImagesHavePremultipliedAlpha:YES];
}
In addition, you will want to make a couple changes to the way the template loads up the view controllers. Normally, cocos2D sets up the navigation controller with director_ as the root view controller. Here, you want to alloc and init your menu view controller and add THAT instead of director_:
// Create a Navigation Controller with the Director
gamesTVC_ = [[GamesTableViewController alloc] initWithStyle:UITableViewStyleGrouped];
navController_ = [[UINavigationController alloc] initWithRootViewController:gamesTVC_];
navController_.navigationBarHidden = NO;
Everything else in didFinishLaunching can remain the same. Now, in your menuViewController in your startGameButtonPressed method, you will call the newly created setupDirector method on your app instance, which is referenced by calling:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
if ([CCDirector sharedDirector].runningScene) {
[[CCDirectorIOS sharedDirector] end];
}
[app setupDirector];
[app.navController pushViewController:app.director animated:YES];
I include a check to make sure the CCDirector isn't still running, and if it is, end it. In your game layer, when the time comes that you want to pop the view controller, you will simply call it like so:
AppController *app = (AppController *)[[UIApplication sharedApplication] delegate];
[app.navController popViewControllerAnimated:YES];
[[CCDirector sharedDirector] end];
This flow should allow you to freely use a navigation controller to push your game scene with CCDirector, and pop that view controller when you want to go back to your UIKit-based main menu. I hope this helps, as I have spent a lot of frustrating time trying to get this right for my own game.