问题
你想使用图形用户界面向用户显示排行榜。
解决方案
使用GKLeaderboardViewController类。
讨论
为你的游戏构造内建的排行榜界面对游戏中心来说简直是小菜一碟。你要做的是建立一个使用视图控制器的iOS应用程序(这超出了本书的范围,不过它在iOS 4 Programming Cookbook中有详细地讲解)。对本节的剩余部分,假设你已经创建的应用程序拥有一个在导航控制器中的视图控制器。下面是让游戏中心构造内建的排行榜界面的步骤:
1. 确保视图控制器符合GKLeaderboardViewControllerDelegate协议。
2. 验证本地玩家(条目1.5)。
3. 分配和实例化一个GKLeaderboardViewController对象,使用视图控制器的实例方法presentModalViewController:animated:向玩家显示。
4. 在视图控制器中实现GKLeaderboardViewControllerDelegate协议的leaderboardViewControllerDidFinish:托管方法。
5. 在leaderboardViewControllerDidFinish:托管方法的实现中,使用视图控制器的实例方法dismissModalViewControllerAnimated:废除排行榜视图控制器。
GKLeaderboardViewController类的实例有三个重要属性:
leaderboardDelegate
该对象将收到来自排行榜视图控制器的托管消息。使用这些托管方法来废除排行榜视图控制器,或做其它一些事情。
timeScope
如果你想缩小排行榜视图控制器显示的成绩范围,可以设置该属性为下面的某个:
GKLeaderboardTimeScopeToday
成绩范围缩小到今天。
GKLeaderboardTimeScopeWeek
成绩范围缩小到本周。该值是默认值。
GKLeaderboardTimeScopeAllTime
显示所有的成绩。
category
要显示的排行榜分类。该属性值是可选的。如果没有设置该值,游戏中心将从默认的排行榜(你可以在iTunes Connect中设置默认的排行榜)取值。
下面看看显示本周成绩的排行榜的示例,该排行榜的“Reference ID”为MGL1LB(条目1.9)。
- (void)leaderboardViewControllerDidFinish:
(GKLeaderboardViewController *)viewController{
/* We are finished here */
[self dismissModalViewControllerAnimated:YES];
}
- (void) viewDidLoad{
[super viewDidLoad];
GKLocalPlayer *localPlayer = [GKLocalPlayer localPlayer];
[localPlayer authenticateWithCompletionHandler:^(NSError *error) {
if (error == nil){
GKLeaderboardViewController *controller =
[[GKLeaderboardViewController alloc] init];
/* The category for our leaderboard. We created this before */
[controller setCategory:@"MGL1LB"];
/* Only show the scores that were submitted this week */
[controller setTimeScope:GKLeaderboardTimeScopeWeek];
[controller setLeaderboardDelegate:self];
[self presentModalViewController:controller
animated:YES];
[controller release];
} else {
NSLog(@"Could not authenticate the local player. Error = %@", error);
}
}];
}
运行程序,在程序加载视图控制器后,你将看到类似于图1-12的结果。
图 1-12 显示本周成绩的排行榜视图控制器
因为我用条目1.10中的方法提交了三个玩家的成绩,因此你在排行榜中看到的是三个玩家的成绩。