我已经为我的游戏建立了一个目标,并且一切工作都很好,接受了使目标完成后不再被调用的部分。
我知道有一个GKAchievement类的“已完成”属性,它是一个布尔值,当成就100%完成时返回yes。

这是当成就达到100%时通过的方法,该方法传递的ID是成就标识符并报告acheeee:

- (void)AchivmentDidAchive:(id)Achivment{
NSString *identifier = Achivment;
NSLog(@"%@",identifier);
self.achivment = [[GKAchievement alloc]initWithIdentifier:identifier];
self.achivment.showsCompletionBanner = YES;


if (!self.achivment.completed) {
    self.achivment.percentComplete = 100;
    NSLog(@"Reproting!");
    [self.achivment reportAchievementWithCompletionHandler: ^(NSError *error)
     {

     }];
}
else {
    NSLog(@"Achivment Completed!");
}   }


我在这里想要做的是将完成的precent设置为100,并在下次报告,即想再次致电。

但它始终有效...如何解决这个更好的主意?

最佳答案

在接口中添加变量和属性:

NSMutableDictionary *earnedAchievementCache;

@property (nonatomic, retain)NSMutableDictionary *earnedAchievementCache;


在.m中:

@synthesize earnedAchievementCache;

- (void) submitAchievement: (NSString*) identifier percentComplete: (double) percentComplete
{




if(self.earnedAchievementCache == NULL)
{

    [GKAchievement loadAchievementsWithCompletionHandler: ^(NSArray *scores, NSError *error)
     {
         if(error == NULL)
         {

             NSMutableDictionary* tempCache= [NSMutableDictionary dictionaryWithCapacity: [scores count]];
             for (GKAchievement* score in scores)
             {
                 [tempCache setObject: score forKey: score.identifier];
             }
             self.earnedAchievementCache= tempCache;
             [self submitAchievement: identifier percentComplete: percentComplete];
         }


     }];
}
else
{

    GKAchievement* achievement= [self.earnedAchievementCache objectForKey: identifier];
    if(achievement != NULL)
    {
        if((achievement.percentComplete >= 100.0) || (achievement.percentComplete >= percentComplete))
        {


            achievement= NULL;



        }
        achievement.percentComplete= percentComplete;
    }
    else
    {
        achievement= [[[GKAchievement alloc] initWithIdentifier: identifier] autorelease];
        achievement.percentComplete= percentComplete;

        [self.earnedAchievementCache setObject: achievement forKey: achievement.identifier];
    }
    if(achievement!= NULL)
    {
        //Submit the Achievement...


        if (achievement.percentComplete>=100) {
           //show banner
            achievement.showsCompletionBanner = YES; //only in IOS 5+
        }



[achievement reportAchievementWithCompletionHandler: ^(NSError *error)
         {
    if (error!=NULL){
            NSLog(@"Error!!");
    } else NSLog(@"all is well");

         }];
    }
}


}


在dealloc中:

[self.earnedAchievementCache release];


我正在使用缓存不提交已经提交/完成的分数

PS:该代码是完美的,只需将其复制并粘贴到您的类中即可使用

关于iphone - 我如何知道GKAchievement是否已完成?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11309540/

10-14 22:26
查看更多