5

为 iPad 模拟器启动时,在 xcode 5 中创建“IOS 项目”会导致以下情况。该应用程序适用于 iPhone 配置。我已将目标设置为 5 及更高版本,并删除了自动布局,因为它与 ios/xcode 5 不兼容。

启动 iPad 应用程序时出现以下错误。

2013-08-29 08:53:57.688 IOS Project[350:c07] -[MasterViewController    setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20
2013-08-29 08:53:57.692 IOS Project[350:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MasterViewController setPreferredContentSize:]: unrecognized selector sent to instance 0x9e2cc20'
*** First throw call stack:
(0x1cd012 0x14c4e7e 0x2584bd 0x1bcbbc 0x1bc94e 0xbe7b 0x624d36 0x85054a 0x8506c3 0x40871e 0x4089a2 0x407876 0x418cb5 0x419beb 0x40b698 0x1f5fdf9 0x1f5fad0 0x142bf5 0x142962 0x173bb6 0x172f44 0x172e1b 0x40717a 0x408ffc 0x6d3d 0x6ca5)
4

3 回答 3

17

尽管在识别问题时接受的答案是正确的,但我不会检查特定的设备版本,而是使用类似的东西

if ( [self respondsToSelector:@selector(setPreferredContentSize:)] ) ...
于 2013-10-13T02:24:00.310 回答
3

在 iOS7 中,UIViewController有一个新的属性preferredContentSize. 为iOS7制作的项目有以下方法:

- (void)awakeFromNib
{
    self.preferredContentSize = CGSizeMake(320.0, 480.0);
    [super awakeFromNib];
}

因此setPreferredContentSize:,无论该属性是否已实现,它都会向您自己的控制器发送一条消息。要解决此问题,您可能希望避免设置不存在的属性:

- (void)awakeFromNib
{
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending) {
        self.preferredContentSize = CGSizeMake(320.0, 480.0);
    }
    [super awakeFromNib];
}
于 2013-09-04T03:57:43.550 回答
2

如果您想在您的应用程序中保持向后兼容性,请始终检查新版本 iOS 中是否存在新引入的方法。如果旧版本中不存在该方法,则不得调用该方法。有一种方法respondsToSelector可以让您知道特定方法的存在。
因此,在您的情况下,如果您想检查preferredContentSize,您可能会这样做:

if ([self respondsToSelector:@selector(preferredContentSize)]) {
    self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
于 2014-03-13T04:53:41.237 回答