如果这是一个完全偏离标记的问题,或者如果我没有包含足够的信息,我会提前道歉 - 我对iOS开发(和Objective-C)很新,并且有跳跃的习惯进入深层......
我无法理解GameCenterManager.m中的“callDelegate”代码,该代码位于GKTapper示例代码中,并在此tuts +教程中提供:http://mobile.tutsplus.com/tutorials/iphone/ios-sdk-game-center-achievements-and-leaderboards-part-2/
这是代码:
- (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");
}
}
我的应用程序始终记录“Missed Method”行,但我不确定这个callDelegate代码实际上在做什么(所以我无法修复它)。我认为最好的方法是了解它实际上在做什么,并获得比“错过的方法”更好的输出......
有一点需要注意的是,我的应用程序目前正在沙盒模式下使用Game Center,因为我还在开发它。在这种情况下可能会出现这种“错过的方法”行 - 我也不确定。
是否有人能够将此代码翻译成段落形式?我特别不确定'[delegate respondsToSelector:selector]'。
或者,是否有人能够重写NSLog行,以便输出更多/相关的问题细节?我试过这个,希望看到哪个选择器没有正确地通过'respondsToSelector',但它似乎不起作用:
NSLog(@"Missed Method, %@", selector);
答案 0 :(得分:5)
最好的方法是确切地看到正在发生的事情是在callDelegate的开头放置一个断点,然后调试你的程序,而不是简单地运行它。您可以按cmd-y进行调试。
这样做,每次程序进入callDelegate函数时,它都会停止并弹出调试器窗口。在那里,您将能够检查呼叫的来源以及参数。
至于这个函数的简单描述,我会说它是一个辅助函数,通过在它前面检查该选择器的存在来包装对选择器的调用。而不是检查每次和执行选择器,而是调用辅助函数,它将为您做两件事。
因此,您始终看到日志行的原因是您要调用的函数不存在。通过使用调试器,您将能够看到它是哪个函数,哪个类缺少它,以及谁尝试了这个操作。
答案 1 :(得分:0)
有些评论要求进一步详细说明我为解决此问题而发表的评论。我不认为这是一个很好的添加作为编辑的问题,因为它具体超过了解决方案。自从我参与这个项目以来已经有一段时间了,所以它并不是我所有人都能做到的。我不确定我是否已经完成了所有事情......但我会尽力解释它。
在文件GameCenterManager.h
中,似乎正在初始化authenticateLocalUser
:
- (void) authenticateLocalUser;
在App_NameViewController.m
文件中,viewDidLoad
正在检查游戏中心是否可用:
self.currentLeaderBoard = kLeaderboardID;
if ([GameCenterManager isGameCenterAvailable]) {
self.gameCenterManager = [[[GameCenterManager alloc] init] autorelease];
[self.gameCenterManager setDelegate:self];
[self.gameCenterManager authenticateLocalUser];
} else {
// The current device does not support Game Center.
}
在档案GameCenterManager.m
- (void) authenticateLocalUser
{
if([GKLocalPlayer localPlayer].authenticated == NO)
{
[[GKLocalPlayer localPlayer] authenticateWithCompletionHandler:^(NSError *error)
{
// report any unreported scores or achievements
[self retrieveScoresFromDevice];
[self retrieveAchievementsFromDevice];
//[self callDelegateOnMainThread: @selector(processGameCenterAuth:) withArg: NULL error: error];
}];
}
}
我注释掉的那条让我超越Missed Method
错误的行是:
[self callDelegateOnMainThread: @selector(processGameCenterAuth:) withArg: NULL error: error];
我希望这有帮助!
答案 2 :(得分:0)
将此代码添加到Game_CenterViewController.m,您将看到错误
- (void)processGameCenterAuth:(NSError *)error{
NSLog(@"error %@", error);
}