Question

Creating "IOS Project" in xcode 5 causes the following when launching for iPad simulator. The application works for iPhones configuration. I have set the target to be 5 and later and removed autolayout as its not compatible with ios/xcode 5.

I get the following error at launch of iPad app.

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)
Was it helpful?

Solution 2

In iOS7, UIViewController has a new property preferredContentSize. A project made for iOS7 has the following method:

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

It therefore sends a setPreferredContentSize: message to your own controller, no matter if the property is implemented or not. To resolve the issue, you might want to avoid setting a property that does not exist:

- (void)awakeFromNib
{
    if ([[[UIDevice currentDevice] systemVersion] compare:@"7" options:NSNumericSearch] != NSOrderedAscending) {
        self.preferredContentSize = CGSizeMake(320.0, 480.0);
    }
    [super awakeFromNib];
}

OTHER TIPS

although the accepted answer is correct in identifying the issue, I wouldn't check for a specific device version and instead use something like

if ( [self respondsToSelector:@selector(setPreferredContentSize:)] ) ...

If you want to maintain backward compatibility in you app, always check existence of the newly introduced methods in newer version of iOS. If the method doesn't exist in older version, it must not be called. There is a method respondsToSelector by which you can know the existence of a particular method.
So in your case if you want to check for preferredContentSize, you may do like like this:

if ([self respondsToSelector:@selector(preferredContentSize)]) {
    self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top