2011-01-31 2 views
0

В fliteTTS.h, он имеет:Как я могу ссылаться на что-то в другом классе?

AVAudioPlayer* audioPlayer; 

И fliteTTS.m имеет:

[audioPlayer stop]; 
audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:tempFilePath] error:&err]; 
[audioPlayer setDelegate:self]; 
[audioPlayer play]; 

Но я хочу поставить эту последнюю строку, аудиоплеер игру, в моем классе ViewController вместо этого. Как мне переписать эту строку для работы там?

ответ

1

Не возвращайте объект. Вместо этого скажите объекту fliteTTS, чтобы играть.

Добавить метод fliteTTS:

-(void)play { 
    [audioPlayer play]; 
} 

Теперь создать экземпляр fliteTTS в контроллере представления, а затем вызвать

[myFliteTTSInstance play] 

Делая это таким образом позволяет класс, который является владельцем аудиоплеер, чтобы сделать другие настройки и разрывы, которые вы можете захотеть сделать, когда начнете играть. Идея состоит в том, чтобы отсортировать аудиоплеер с объектом, которому он принадлежит, вместо прямого доступа к нему от того, кто знает, где.


В качестве альтернативы вы можете создать способ возврата аудиопроигрывателя напрямую.

-(AVAudioPlayer*)audioPlayer { 
    return audioPlayer; 
} 

А потом с контроллера зрения, вы могли бы назвать

[[myFliteTTSInstance audioPlayer] play]; 

Но это более хрупкими по разным причинам. Если класс fliteTTS содержит экземпляр аудиоплеера, он также должен иметь возможность контролировать его для вас. Так сделайте это первым способом, если сможете.

0

Предполагая, что класс называется fliteTTS, вы можете определить метод «play» в fliteTTS.h.

- (void)play; 

И затем осуществить его в fliteTTS.m.

- (void)play { 
    [audioPlayer play]; 
} 

Затем в контроллере представления вы можете позвонить ...

fliteTTS *myFliteTTS = [[fliteTTS alloc] init]; 
[myFliteTTS play]; 
[myFliteTTS release]; 
+1

Кстати, это хорошая практика, чтобы назвать свои классы с капиталом для первой буквы - FliteTTS вместо fliteTTS. – benwong