Средство выбора медиафайлов iOS не отображается - PullRequest
4 голосов
/ 07 марта 2011

В настоящее время я работаю над аудиоприложением на iPhone. Он основан на примере кода Apple SpeakHere с пользовательским входным файлом из библиотеки iPod.

Вот событие, вызванное кнопкой:

- (IBAction) btn_PickSong_Clicked:(id)sender{

[self showMediaPicker]; 

//code importing tracks from library
}

А в методе showMediaPicker:

//Yup the program does reach this method but the picker does not show up    
- (void)showMediaPicker {

MPMediaPickerController* mediaPicker = [[[MPMediaPickerController alloc] initWithMediaTypes:MPMediaTypeMusic] autorelease];
mediaPicker.delegate = self;
[self presentModalViewController:mediaPicker animated:YES];
}

Проблемы:

  1. Функция импорта библиотеки прекрасно работает в отдельной программе, но средство выбора мультимедиа больше не отображается, когда я помещаю код в SpeakHereController.mm.

  2. Также, если я помещаю метод showMediaPicker в другой класс и вызываю его, он также не работает.

Что-то, что мне кажется уместным:

  1. Исходный код находится в файле obj-C (xxx.m), и теперь он переносится в файл obj-C ++ (xxx.mm).

  2. Я также изменил базовый класс SpeakHereController.h с NSObject на UIViewController<MPMediaPickerControllerDelegate>, иначе будет выдано предупреждение о том, что базовый класс не содержит требуемого делегата. Но в конструкторе интерфейса он по-прежнему отображается как объект (см. Пример кода SpeakHere).

  3. Кажется, что незаконно конвертировать встроенный файл xxxViewController.m в файл obj-C ++ (расширение .mm). В этом случае будет много ошибок, если я попытаюсь это сделать. Это правда? Если да, то как включить код C ++ в чистый файл obj-C?

=============

Так как же я могу сделать так, чтобы в этом случае появлялся медиа-сборщик? Любое понимание будет оценено.

Большое спасибо!

Приветствия

* * Manca тысяча сорок-девять

1 Ответ

1 голос
/ 30 марта 2011

Чтобы

[self presentModalViewController:mediaPicker animated:YES];

работал, self должен быть viewcontroller.Я обеспокоен тем, что вы только что изменили базовый класс, чтобы избежать ошибок компилятора, так как это говорит о том, что вы на самом деле не создаете 'self' правильно.

Так как же вы инициализируете SpeakHereController?В качестве контроллера представления это обычно происходит через назначенный инициализатор, который для UIViewController, конечно, initWithNibName: bundle:

Вы можете найти документацию для UIViewController полезной.

Что касается вопроса C ++.Хотя вы можете смешивать Objective-C и C ++ так, как вы предлагаете, я бы порекомендовал вам инкапсулировать ваш код C ++ в его собственный класс, а не разбрасывать его вокруг кода вашего контроллера представления.Это сделает его более пригодным для обслуживания в будущем.

...