Reputation: 650
Im trying to dismiss Game Center when the user is pressing Done, why is this not working?? I've looked at the Apple docs and Googled it ever way I can think of, what is wrong?
GCHelper.h
#import <Foundation/Foundation.h>
#import <GameKit/GameKit.h>
@protocol GameCenterManagerDelegate
@end
@interface GCHelper : NSObject <GKGameCenterControllerDelegate, GKAchievementViewControllerDelegate, GKLeaderboardViewControllerDelegate> {
BOOL gameCenterAvailable;
BOOL userAuthenticated;
UIViewController *presentingViewController;
id <GameCenterManagerDelegate> delegate;
}
@property (nonatomic, strong) id <GameCenterManagerDelegate> delegate;
@property (assign, readonly) BOOL gameCenterAvailable;
@property (retain) UIViewController *presentingViewController;
+ (GCHelper *) showGameCenter;
+ (GCHelper *)sharedInstance;
- (void)authenticateLocalUser;
@end
GCHelper.m
#import "GCHelper.h"
@implementation GCHelper
@synthesize gameCenterAvailable;
@synthesize presentingViewController;
@synthesize delegate;
#pragma mark Initialization
static GCHelper *sharedHelper = nil;
static GCHelper *showGameCenter = nil;
+ (GCHelper *) sharedInstance {
if (!sharedHelper) {
sharedHelper = [[GCHelper alloc] init];
}
return sharedHelper;
}
- (BOOL)isGameCenterAvailable {
// check for presence of GKLocalPlayer API
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));
// check if the device is running iOS 4.1 or later
NSString *reqSysVer = @"4.1";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer compare:reqSysVer
options:NSNumericSearch] != NSOrderedAscending);
return (gcClass && osVersionSupported);
}
- (id)init {
if ((self = [super init])) {
gameCenterAvailable = [self isGameCenterAvailable];
if (gameCenterAvailable) {
NSNotificationCenter *nc =
[NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(authenticationChanged)
name:GKPlayerAuthenticationDidChangeNotificationName
object:nil];
}
}
return self;
}
- (void)authenticationChanged {
if ([GKLocalPlayer localPlayer].isAuthenticated && !userAuthenticated) {
NSLog(@"Authentication changed: player authenticated.");
userAuthenticated = TRUE;
} else if (![GKLocalPlayer localPlayer].isAuthenticated && userAuthenticated) {
NSLog(@"Authentication changed: player not authenticated");
userAuthenticated = FALSE;
}
}
#pragma mark User functions
- (void)authenticateLocalUser {
if (!gameCenterAvailable) return;
NSLog(@"Authenticating local user...");
if ([GKLocalPlayer localPlayer].authenticated == NO) {
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:nil];
} else {
NSLog(@"Already authenticated!");
}
}
/*
- (void) showBanner
{
NSString* title = [self generateTitle];
NSString* message = [self generateBannerMessage];
[GKNotificationBanner showBannerWithTitle: title message: message
completionHandler:^{
[self advanceToNextInterfaceScreen]
}];
}
*/
+ (GCHelper *)showGameCenter
{
@synchronized (self)
{
GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
if (gameCenterController != NULL)
{
[[CCDirector sharedDirector]presentViewController:gameCenterController animated:YES completion:nil];
}
}
return showGameCenter;
}
// When player dismisses game center.
- (void)gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController
{
gameCenterViewController.gameCenterDelegate = self;
[gameCenterViewController dismissModalViewControllerAnimated:YES];
}
@end
Upvotes: 0
Views: 658
Reputation: 575
That's not the director that needs to be dismissed, but the GKGameCenterViewController
that you receive by parameter in the function -(void)gameCenterViewControllerDidFinish
. You should do this :
- (void) gameCenterViewControllerDidFinish:(GKGameCenterViewController *)gameCenterViewController{
[gameCenterViewController dismissViewControllerAnimated:YES completion:nil];
}
EDIT : You also have to set the delegate of your controller to your current scene and implement <GKGameCenterControllerDelegate>
in the .h file of your class :
//In your .h file
@interface foo : CCScene <GKGameCenterControllerDelegate>{
}
//In you .m file
GKGameCenterViewController *gameCenterController = [[GKGameCenterViewController alloc] init];
if (gameCenterController != NULL)
{
gameCenterController.gameCenterDelegate = self;
[[CCDirector sharedDirector]presentViewController:gameCenterController animated:YES completion:nil];
}
Upvotes: 2