Увольняющий модальный вид GameKit - PullRequest
2 голосов
/ 22 июля 2011

Я пытаюсь интегрировать игровой центр Apple в свое приложение. Я могу успешно опубликовать результаты в таблице лидеров и показать таблицу лидеров, но проблема возникает, когда я пытаюсь отклонить модальное представление таблицы лидеров. Я следовал указаниям Apple по руководству по программированию Game Kit ([url] http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/GameKit_Guide/LeaderBoards/LeaderBoards.html[/url]).

Мой код для Game Center выглядит следующим образом:

-(BOOL)isGameCenterAvailable{
    // Check for presence of GKLocalPlayer class.
    BOOL localPlayerClassAvailable = (NSClassFromString(@"GKLocalPlayer")) != nil;

    // The device must be running iOS 4.1 or later.
    NSString *reqSysVer = @"4.1";
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);
    return (localPlayerClassAvailable && osVersionSupported);
}

- (void) authenticateLocalPlayer
{
    if([self isGameCenterAvailable]){
        GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
        [localPlayer authenticateWithCompletionHandler:^(NSError *error) {
            if (localPlayer.isAuthenticated)
            {
                // Perform additional tasks for the authenticated player.
            }
        }];
    }
}

- (void) reportScore: (int64_t) score forCategory: (NSString*) category
{
    GKScore *scoreReporter = [[[GKScore alloc] initWithCategory:category] autorelease];
    scoreReporter.value = score;

    [scoreReporter reportScoreWithCompletionHandler:^(NSError *error) {
        if (error != nil)
        {
            // handle the reporting error
        }
    }];
}

- (void) showLeaderboard
{
    GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
    if (leaderboardController != nil)
    {
        leaderboardController.leaderboardDelegate = self;
        [self presentModalViewController: leaderboardController animated: YES];
    }
    //[leaderboardController release];
}

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{

    if([self modalViewController] != nil){
        [self dismissModalViewControllerAnimated:YES];
    }

}

-(IBAction)show{
    [self showLeaderboard];
}

-(IBAction)submit{
    [self reportScore:9 forCategory:kLeaderboardID];
}

Xcode сообщает, что проблема в строке [self dismissModalViewControllerAnimated: YES]; он говорит, что у меня плохой доступ, что, как я знаю, означает, что я пытаюсь получить доступ к плохому указателю, но я не понимаю, почему что-то не может быть недействительным Self сообщает, что у него есть modalviewcontroller. Я перепробовал всевозможные варианты, и я совершенно сбит с толку, почему он дает мне ошибки.

Любая помощь или предложения будут с благодарностью.

Заранее спасибо!

1 Ответ

0 голосов
/ 02 августа 2011

У меня только что была очень похожая проблема в моем приложении. Я обнаружил, что он не связан с самим ModalViewController, а отображает его на контроллере представления.

Если вы профилируете приложение, используя опцию зомби в Профилировщике, вы сможете увидеть, что что-то выпускается, чего не должно быть (скорее всего, UIImage или UIView). Вы должны быть в состоянии отследить функцию, где был размещен зомбированный объект, чтобы найти реальный объект, вызывающий проблему.

Я предполагаю, что причина, по которой ошибка отображается при закрытии ModalViewController, заключается в том, что различные элементы представления вызываются для перерисовки или обновления после того, как диалоговое окно исчезает, а затем происходит доступ к чему-то, что было выпущено, когда этого не должно было быть.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...