Что вызывает пропущенный метод в этом коде № 2?

У меня та же проблема, что и в этой теме: Что вызывает "Пропущенный метод" в этом код?

но я не понимаю, как это решить и если это вообще проблема.

Я делаю учебник в книге «Начало iOS Game Center и Game Kit» и получаю эту проблему. Я все время получаю «... Пропущенный метод» и пытаюсь понять, почему, к сожалению, не понимаю. Я также пытался использовать ответ в теме выше, но безрезультатно.

Я был бы очень признателен за помощь в этом.

Код, который я использую в настоящее время:

#import "GameCenterManager.h"

@implementation GameCenterManager

@synthesize delegate;

+(BOOL)isGameCenterAvailable {
Class gcClass = (NSClassFromString(@"GKLocalPlayer"));

NSString *reqSysVer = @"4.1";
NSString *currSysVer = [[UIDevice currentDevice]systemVersion];

BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

return (gcClass && osVersionSupported);
}

-(void)retrieveFriendsList {

if ([GKLocalPlayer localPlayer].authenticated == YES) {
    [[GKLocalPlayer localPlayer]loadFriendsWithCompletionHandler:^(NSArray *friends, NSError *error) {
        [self callDelegateOnMainThread:@selector(friendsFinishLoading:error:) withArg:friends error:error];
    }];
} else {
    NSLog(@"...You must authenticate first");
}
}

-(void)authenticateLocalUser {

if ([GKLocalPlayer localPlayer].authenticated) {
    return;
}

[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error){
    [self callDelegateOnMainThread:@selector(processGameCenterAuthentication:) withArg:NULL error: error];
}];
}

-(void)callDelegateOnMainThread:(SEL)selector withArg: (id) arg error:(NSError*) err {
dispatch_async(dispatch_get_main_queue(), ^(void) {
    [self callDelegate:selector withArg: arg error: err];
});
}

-(void)callDelegate: (SEL) selector withArg: (id) arg error: (NSError*) err {
assert([NSThread isMainThread]);

if ([delegate respondsToSelector: selector]) {
    if(arg != NULL) {
        [delegate performSelector: selector withObject: arg withObject: err];

    } else {
        [delegate performSelector: selector withObject: err];
    }
} else {
    NSLog(@"...Missed Method");
}
}

Вывод после авторизации GC:

...Missed Method

person PeterK    schedule 29.12.2012    source источник


Ответы (1)


Вы кодируете вызовы [self callDelegateOnMainThread:@selector(processGameCenterAuthentication:) withArg:NULL error: error];, которые заканчиваются методом (callDelegate:withArg:error:), который проверяет, реализован ли в вашем классе метод processGameCenterAuthentication:. Вы получаете вывод Missed Method, потому что, похоже, вы его не реализовали.

person JustSid    schedule 29.12.2012
comment
Я действительно вызываю метод, однако я обнаружил, что метод выполняется дважды, и это второй раз, когда он ... Пропускает метод. - person PeterK; 29.12.2012
comment
Я обнаружил проблему, это была опечатка в селекторе, вызывающем friendsFinishedLoading, у меня было (в приведенном выше коде) friendsFinishLoading. Я такой n00b :-( ...однако БОЛЬШОЕ спасибо JustSid за то, что направил меня на правильный путь. - person PeterK; 29.12.2012