在iOS7中,我应该使用什么替代已弃用的GKLeaderboardViewController?

4

我已经更新了我的iOS 7应用程序,但游戏中心有一些已被弃用的功能,比如加载和关闭排行榜和成就,我该怎么修复它们?它显示GKLeaderboardViewController已被弃用。

- (IBAction)LeaderBoardsButton:(id)sender {
GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
if (leaderboardController != NULL)
{
    leaderboardController.leaderboardDelegate = self;
    [self presentViewController:leaderboardController animated:YES completion:NULL];
}
{
    AudioServicesPlaySystemSound(SoundID);
}
}

- (void)leaderboardViewControllerDidFinish:(GKLeaderboardViewController *)viewController
{
[self dismissViewControllerAnimated:YES completion:NULL];
{
    AudioServicesPlaySystemSound(SoundID2);
}
}

- (IBAction)AchievementsButton:(id)sender {
GKAchievementViewController *achievements = [[GKAchievementViewController
                                              alloc] init];
if (achievements != nil)
{
    achievements.achievementDelegate = self;
    [self presentViewController:achievements animated:YES completion:NULL];
}
{
    AudioServicesPlaySystemSound(SoundID);
}
}

- (void)achievementViewControllerDidFinish:(GKAchievementViewController
                                        *)viewController
{
[self dismissViewControllerAnimated:YES completion:NULL];
{
    AudioServicesPlaySystemSound(SoundID2);
}
}

我会将分数报告如下:

我以以下方式报告分数

- (IBAction)ShareScore:(id)sender {
[self.gameCenterManager reportScore: counter forCategory: self.currentLeaderBoard];

GKLeaderboardViewController *leaderboardController = [[GKLeaderboardViewController alloc] init];
if (leaderboardController != NULL)
{
    leaderboardController.category = self.currentLeaderBoard;
    leaderboardController.timeScope = GKLeaderboardTimeScopeToday;
    leaderboardController.leaderboardDelegate = self;
    [self presentViewController:leaderboardController animated:YES completion:NULL];
}
{
    AudioServicesPlaySystemSound(SoundID);
}
}
1个回答

22

iOS 7将排行榜、成就等控制器合并到了GKGameCenterViewController类中。您可以使用viewState参数来控制您想要显示的视图。

您可以按照以下方式来呈现/关闭排行榜:

- (void) presentLeaderboards {
    GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init];
    gameCenterController.viewState = GKGameCenterViewControllerStateLeaderboards;
    gameCenterController.gameCenterDelegate = self;
    [self presentViewController:gameCenterController animated:YES completion:nil];
}

- (void) gameCenterViewControllerDidFinish:(GKGameCenterViewController*) gameCenterViewController {
    [self dismissViewControllerAnimated:YES completion:nil];
}

同样地,用于展示成就,您可以这样做:

- (void) presentAchievements {
    GKGameCenterViewController* gameCenterController = [[GKGameCenterViewController alloc] init];
    gameCenterController.viewState = GKGameCenterViewControllerStateAchievements;
    gameCenterController.gameCenterDelegate = self;
    [self presentViewController:gameCenterController animated:YES completion:nil];
}

报告成绩看起来会像这样:

- (void) reportHighScore:(NSInteger) highScore forLeaderboardId:(NSString*) leaderboardId {
    if ([GKLocalPlayer localPlayer].isAuthenticated) {
        GKScore* score = [[GKScore alloc] initWithLeaderboardIdentifier:leaderboardId];
        score.value = highScore;
        [GKScore reportScores:@[score] withCompletionHandler:^(NSError *error) {
            if (error) {
                NSLog(@"error: %@", error);
            }
        }];
    }
}

嗨Greg,那个完美地解决了我的问题。我编辑了问题,因为我错过了报告分数部分。我该如何处理它? - Azabella
1
你的意思是如何调用reportHighScore:forLeaderboardId:方法吗?这类似于你上面写的这行代码:[self.gameCenterManager reportScore:counter forCategory:self.currentLeaderBoard];。相反,你可以这样做:[self reportHighScore:counter forLeaderboardId:self.currentLeaderBoard];。 - Greg
@Greg,高分是什么? - Jacobanks
翻译:像score.value = Highscore这样的错误 - Jacobanks
这是我示例中 reportHighScore:forLeaderboardId: 方法的第一个参数。GKScore 的 value 属性的文档在此处:https://developer.apple.com/library/ios/documentation/GameKit/Reference/GKScore_Ref/Reference/Reference.html#//apple_ref/occ/instp/GKScore/value - Greg
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接