为什么我的Xcode将可选的委托方法识别为无法识别的选择器?

时间:2012-09-23 15:08:44

标签: objective-c crash selector ios6

这是我的崩溃日志。

2012-09-24 00:06:16.711 DMJ[10021:c07] -[DMJAppDelegate application:supportedInterfaceOrientationsForWindow:]: unrecognized selector sent to instance 0x84abe70
2012-09-24 00:06:16.713 DMJ[10021:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DMJAppDelegate application:supportedInterfaceOrientationsForWindow:]: unrecognized selector sent to instance 0x84abe70'
*** First throw call stack:
(0x2553012 0x1e04e7e 0x25de4bd 0x1e187ea 0x2542cf9 0x254294e 0x82a332 0x91266d 0x90d046 0x90d246 0x85601f 0x476e8e 0x4769b7 0x875573 0x4a1428 0xa420cc 0x1e18663 0x254e45a 0xa40bcf 0xa4298d 0x824ceb 0x825002 0x823ed6 0x835315 0x83624b 0x827cf8 0x2c88df9 0x2c88ad0 0x24c8bf5 0x24c8962 0x24f9bb6 0x24f8f44 0x24f8e1b 0x8237da 0x82565c 0x2ded 0x2d25 0x1)
libc++abi.dylib: terminate called throwing an exception
(lldb)

2 个答案:

答案 0 :(得分:5)

协议上下文中的可选意味着您不需要实现该方法。 但是你也必须注意不要调用这些方法,否则你会得到一个例外。 通常在调用可选协议方法之前,您将执行以下操作:

if ([object respondsToSelector:@selector(application:supportedInterfaceOrientationsForWindow:)])
    result = [object application:myApp supportedInterfaceOritentationsForWindow:myWin];

如上所述,该方法可能会被调用,因为您的info.plist不包含正确的键(UIInterfaceOrientation)。

答案 1 :(得分:0)

您是否确定您的Delegate类符合UIApplicationDelegate协议?

您的DMJAppDelegate.h应该

@interface DMJAppDelegate : NSObject <UIApplicationDelegate> 

同样如Apple Developer Documentation中提到的关于UIApplicationDelegate,如果您的应用程序Info.plist没有指定有效方向的密钥UIInterfaceOrientation,那么它将调用supportedInterfaceOrientationsForWindow代理人(因此在这种情况下不是可选的)所以如果你没有实现委托方法,你需要确保你已经在Info.plist中指定了方向

这是在打开Info.plist时在Xcode中指定的方式(如果您正在开发通用应用程序,则分别针对iPhone和iPad)

Xcode Info.plist Orientation

或者,您可以通过在项目摘要

中选择目标来查看支持的界面方向

Xcode Project Summary