Ошибка setPreferredContentSize в приложении iOS

Создание «Проекта IOS» в xcode 5 вызывает следующее при запуске симулятора iPad. Приложение работает для конфигурации 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)

person dhaval    schedule 29.08.2013    source источник


Ответы (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];
}
person Teebrin    schedule 04.09.2013

хотя принятый ответ правильный при определении проблемы, я бы не стал проверять конкретную версию устройства и вместо этого использовал что-то вроде

if ( [self respondsToSelector:@selector(setPreferredContentSize:)] ) ...
person r618    schedule 13.10.2013
comment
Твой ответ мне очень помог, т. - person JJ86; 06.02.2014

Если вы хотите сохранить обратную совместимость в своем приложении, всегда проверяйте наличие новых методов в новой версии iOS. Если метод не существует в более старой версии, его нельзя вызывать. Существует метод respondsToSelector, с помощью которого вы можете узнать о существовании определенного метода.
Итак, в вашем случае, если вы хотите проверить preferredContentSize, вы можете сделать так:

if ([self respondsToSelector:@selector(preferredContentSize)]) {
    self.preferredContentSize = CGSizeMake(320.0, 600.0);
}
person Homam    schedule 13.03.2014