Загрузка различных медиа-файлов для каждого подкласса представления с использованием NSString * const - PullRequest
0 голосов
/ 14 июня 2011

Я делаю подкласс UIView полностью в коде (без IB), назовем его ContentView .С этой точки зрения я уже настроил несколько проигрывателей для звуков и видео, а также несколько imageViews (ничего особенного).

Затем я планировал создать подкласс ContentView несколько раз по порядку.загрузить разные медиа для каждого просмотра.Все эти представления будут иметь один и тот же контроллер представления, поскольку интерфейс будет одинаковым для всех из них, изменится только контент (звуки, видео и изображения).

Поэтому мой подход к этой проблеме состоял в том, чтобы объявитьнесколько NSString *const в ContentView .h и укажите их ключи / значения в файле реализации каждого представления подкласса ContentView в форме static NSString *const, поскольку я буду использовать повторноони загружали разные медиа для каждого представления и не хотели их в глобальном пространстве имен.

Вот некоторый макет кода, который иллюстрирует то, о чем я говорю:

В ContentView.h

@interface ContentView : UIView {

NSString *const kSoundFile1;
NSString *const kSoundFile2;
NSString *const kSoundFileType;
NSString *const kMovieFile1;
NSString *const kMovieFile2;
NSString *const kMovieFileType;
NSString *const kImage1;
NSString *const kImage2;

и в ContentView.m, что-то в этом роде,

@implementation ContentView 

- (id)initWithFrame:(CGRect)frame
{ 
   self = [super initWithFrame:frame];
       if (self) {

       NSString *filePath1 = [[NSBundle mainBundle] pathForResource: kSoundFile1 
                                                         ofType: kSoundFileType;

       NSURL *url1 = [[NSURL alloc] initFileURLWithPath:filePath1];

       AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:nil];
       [audioPlayer1 prepareToPlay];
       [url1 release];

... и так далее, для остальных звуковых файлов и фильмов (за исключением изображений,для которого я использую imageNamed:).

Затем в файле реализации каждого подкласса ContentView у меня есть только это:

@implementation ContentViewSubclass

static NSString *const kSoundFile1 = @"sound1";
static NSString *const kSoundFile2 = @"sound2";
static NSString *const kSoundFileType = @"wav";
static NSString *const kMovieFile1 = @"movie1";
static NSString *const kMovieFile2 = @"movie2";
static NSString *const kMovieFileType = @"mov";
static NSString *const kImage1 = @"image1.png";
static NSString *const kImage2 = @"image2.png";

@end

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

Я был бы очень признателен за некоторые идеи.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 16 июня 2011

Хотя приведенный ниже ответ @deanWombourne имеет смысл, у меня возникла проблема с его решением. Но я выяснил, что с ним не так (по крайней мере, это мое мнение, и оно работает сейчас).

Подкласс UIView уже имеет собственный назначенный инициализатор, который является -(id)initWithFrame, поэтому вызов -(id)init для любого последующего подкласса ContentView не будет обновлять какие-либо переменные экземпляра, поскольку [super init] указывает на нигде (или лучше, сначала суперкласс запускает initWithFrame и только затем он запускает init, что аналогично тому, что ничего не сделал).

Итак, мое решение следующее:

(после изменения ivars на ContentView.h на форму NSString *pointer, например, NSString *kSoundFile1),

@implementation ContentViewSubclass

- (id)initWithFrame:(CGRect)frame {

        kSoundFile1 = @"sound1";
        kSoundFile2 = @"sound2";
        kSoundFileType = @"wav";
        kMovieFile1 = @"movie1";
        kMovieFile2 = @"movie2";
        kMovieFileType = @"mov";
        kImage1 = @"image1.png";
        kImage2 = @"image2.png";

    self = [super initWithFrame:frame];
    if (self) {

    }
    return self;
}

@end

Сначала обновите строки в назначенном инициализаторе -(id)initWithFrame, и только затем вызовите super. Теперь все работает отлично.

Искренне благодарю @deanWombourne за помощь в решении этой проблемы.

0 голосов
/ 14 июня 2011

Я думаю, я мог бы решить это, игнорировать мой другой ответ:)

Вы настроили строки как члены ContentView (в ContentView.h). Они начинаются с инициализации nil.

Затем в каждом подклассе вы создаете новые строки с тем же именем, но только в этом файле .m (статическое ключевое слово делает это!). Просто потому, что они имеют одинаковое имя в коде C, не означает, что они указывают на один и тот же объект:)

Ваш файл ContentView.m не может видеть новые строки, он просто использует те, которые определены в вашем файле .h, для которых никогда не было установлено ничего, поэтому я уверен, что они все еще nil!

Вам нужно определить строки в ваших подклассах следующим образом:

@implementation ContentViewSubclass

- (id)init {
    self = [super init];
    if (self) {
        kSoundFile1 = @"sound1";
        kSoundFile2 = @"sound2";
        kSoundFileType = @"wav";
        kMovieFile1 = @"movie1";
        kMovieFile2 = @"movie2";
        kMovieFileType = @"mov";
        kImage1 = @"image1.png";
        kImage2 = @"image2.png";
    }
    return self;
}

@end

PS. k перед этими именами больше не имеет смысла - я бы от этого избавился)

0 голосов
/ 14 июня 2011

РЕДАКТИРОВАТЬ: Этот ответ полностью лает неправильное дерево.Попробуйте этот вместо:)


Я мгновенно ищу эту строку:

AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:nil];

SDK хочет сообщить вамошибка, но вы просите неТогда вы жалуетесь, что ошибки нет!

Попробуйте:

NSError *error = nil;
AVAudioPlayer *audioPlayer1 = [AVAudioPlayer alloc] initWithContentsOfURL:url  error:&error];
if (error) {
    NSLog(@"error : %@", error);
}

и сообщите нам, что вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...