контроллер imagepicker показывает ошибку при сборке для симулятора iphone 3.0 - PullRequest
0 голосов
/ 16 января 2010

Я занимаюсь разработкой приложения, которое использует как запись видео, так и фотосъемку. Поэтому я хочу показать кнопки в соответствии с ОС, для этого я реализую эти методы. Это работает нормально, когда я собираюсь для OS 3.1, но когда я собираю для OS 3.0 показывает ошибки

вот методы

    if ([self videoRecordingAvailable])
    {
        imagePickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
        imagePickerController.allowsImageEditing = YES;
        imagePickerController.allowsEditing = YES;
        imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
        imagePickerController.videoMaximumDuration = 60.0f; // Length for video recording in seconds
        imagePickerController.mediaTypes = [NSArray arrayWithObjects:@"public.movie", nil];
        imagePickerController.showsCameraControls=YES;      
        [self.navigationController presentModalViewController:imagePickerController animated:YES];          
    }


- (BOOL) videoRecordingAvailable
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return NO;
return [[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera] containsObject:@"public.movie"];
}

ошибки

error: request for member 'allowsEditing' in something not a structure or union
error: request for member 'videoQuality' in something not a structure or union
error: 'UIImagePickerControllerQualityTypeHigh' undeclared (first use in this function)
 (Each undeclared identifier is reported only once for each function it appears in.)
error: request for member 'videoMaximumDuration' in something not a structure or union
error: request for member 'showsCameraControls' in something not a structure or union

как мне решить эту проблему?

1 Ответ

1 голос
/ 16 января 2010

Проблема в том, что захват видео был добавлен в 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 очень хорошо.

...