Проблема в том, что захват видео был добавлен в 3.1, что означает, что средство выбора изображений из 3.0 не поддерживает какие-либо свойства и методы видео (см. документацию и обратите внимание на доступность секции).
Что касается решения, я думаю, вы можете попробовать использовать синтаксис сообщения вместо точечного синтаксиса:
[picker setShowsCameraControls:YES];
Тем не менее, вы получите предупреждения (при компиляции для 3.0 и старше), и вы должны быть осторожны, чтобы не делать это на старых устройствах, потому что вы получите неизвестное исключение селектора. Или вы можете вызвать селектор динамически, что избавит от предупреждений, и вы также можете проверить, поддерживается ли селектор первым:
SEL msg = @selector(setShowsCameraControls:);
if ([picker respondsToSelector:msg])
[picker performSelector…];
Уже есть несколько вопросов о написании для разных версий ОС.
Отвечая на комментарии: Я думаю, что главная проблема в том, что вы слепо вставляете код, не понимая его. Не делай этого. Сядьте и подумайте, что делает код, пока не поймете каждую строчку. Теперь, чтобы объяснить вашу проблему более подробно:
Средство выбора изображений в версии 3.0 не имеет элементов управления видео, поскольку оно не может записывать видео. Поэтому, когда вы пытаетесь скомпилировать код, такой как picker.showsCameraControls
, компилятор жалуется: в классе Image Picker нет свойства showsCameraControls
, которое было добавлено только в 3.1.
Но есть способ обойти это, вы можете использовать синтаксис сообщения ([foo setBar:…]
) вместо точечного синтаксиса (foo.bar=…
). Если у объекта foo
нет метода setBar
, компилятор предупредит вас, но код скомпилируется. Теперь давайте используем синтаксис сообщения для установки элементов управления камерой:
[picker setShowsCameraControls:YES];
Когда вы компилируете этот код для 3.1, он будет компилироваться без предупреждения и работать без ошибок. Когда вы компилируете для 3.0, вы получите предупреждение от компилятора, и если вы запустите код, он потерпит неудачу (поскольку в действительности нет свойства showsCameraControls
). Но это не проблема, так как вы можете решить запустить хрупкий код, только если ОС его поддерживает:
BOOL videoSupported = [picker respondsToSelector:@selector(setShowsCameraControls:)];
if (videoSupported) {
[picker setShowsCameraControls:YES];
// set all the other video properties
} else {
// do what makes sense without video support
}
Это будет работать, но вы все равно будете получать предупреждения компилятора на 3.0. Теперь это зависит от вашей цели сборки по умолчанию. Если вы создаете для 3.1, предупреждения исчезнут, и код должен работать на 3.0 очень хорошо.