2016-05-30 4 views
1

Я очень новичок в объектах c и OpenEars, поэтому, пожалуйста, простите меня, если у меня есть грязный код, и если я потерянный в очень простой проблеме.Открытый текст ушей для речи (голос) не работает при получении строки из другого класса/контроллера (IOS, Objective c)

Во всяком случае, у меня есть два контроллера в этом приложении. Первый из них - это ViewController по умолчанию, а второй - новый, который я создал с помощью функции ReplyManagerController.

Код в ViewController в основном использует ту, что находится в учебнике, с некоторыми (возможно, некоторыми) изменениями.

EDIT:

приложение должно быть основным приложением, в котором пользователь говорит что-то и приложение ответы.

Но первоначальная проблема заключалась в том, что я не мог заставить строку отображаться или работать с TTS, когда мой ViewController получил строку из другого класса/контроллера.

В ответе на моем примере упоминается, что это, вероятно, потому, что мой другой класс вызывал мой ViewController без инициализации self.fliteController.

Как инициализировать ViewController с инициализацией self.fliteController?

ViewController.m

- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID { 

NSString *strResult = hypothesis; //speech to text to string 

ReplyManager* replyObject = [[ReplyManager alloc] init]; 
[replyObject speechResult:(NSString*)strResult viewController:self]; 
} 

- (void) getReply:(NSString*)replyStr{ 

[self.fliteController say:replyStr withVoice:self.slt]; 

[self updateText:replyStr]; 
} 

- (IBAction)updateText:(NSString*)replyStr{ 
labelOne.text = replyStr; 
labelOne.adjustsFontSizeToFitWidth = YES; 
labelOne.minimumFontSize = 0; 

} 

Любая помощь будет здорово! Благодаря!

ReplyManager.m

- (void) speechResult:(NSString*)strResult { 

    NSString *replystr; 
    NSString *greetings = @"Hi!"; 
    NSString *sorry = @"Sorry I didn't catch that?"; 

    ViewController* getReply = [[ViewController alloc] init]; 

    if ([strResult isEqualToString:@"HELLO"]) 
     { 
     replystr = greetings; 
     [getReply getReply:(NSString*)replystr]; 
     } 
    else 
     { 
     replystr = sorry; 
     [getReply getReply:(NSString*)replystr]; 
     } 
} 

EDIT 2:

viewDidLoad Метод

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    self.fliteController = [[OEFliteController alloc] init]; 
    self.slt = [[Slt alloc] init]; 

    self.openEarsEventsObserver = [[OEEventsObserver alloc] init]; 
    [self.openEarsEventsObserver setDelegate:self]; 
} 

ответ

0

Это звучит как проблема синхронизации, когда вы пытаетесь использовать fliteController, прежде чем он будет инициализирован.

В вашем классе ViewController, где вы присваиваете значение fliteController? В инициализаторе? -(void)viewDidLoad?

В ReplyManagerController добавить:

ViewController* getReply = [[ViewController alloc] init]; 

// Add these lines 
NSLog(getReply.fliteController); // Is this nil? 
[getReply.view layoutIfNeeded]; 
NSLog(getReply.fliteController); // Is it still nil? 

исправить ли выше проблемы? Если это так, вы, вероятно, инициализируете fliteController в -(void)viewDidLoad. Каков результат двух заявлений NSLog?

+0

Да Я загружаю fliteController в - (void) viewDidLoad. – user2438817

+0

И я получаю нуль в первом NSLog и получаю что-то в следующем – user2438817

+0

Ну, вот и все. Проблема заключалась в том, что вы выделяете/init'd 'ViewController', но' - (void) viewDidLoad' никогда не вызывался для инициализации 'fliteController'. Добавление '[getReply.view layoutIfNeeded];' (или просто ссылка на 'view') вызвало запуск' viewDidLoad'. –

1
ViewController* getReply = [[ViewController alloc] init]; 

Здесь вы инициализировать новый ViewController, который не имеет self.fliteController определяются скорее. Вам необходимо повторно Previos контроллер, например, как это:

[replyObject speechResult:(NSString*)strResult viewController:self]; 

Таким образом, вы можете использовать уже инициализирован viewController позже. В целом лучше инициализировать объекты вроде viewController или replyController заранее, а не внутри методов обратного вызова.

+0

Извините за поздний комментарий, но я получаю сообщение об ошибке: «Нет видимого @interface для ReplyManager объявляет селектор selectReply: viewController: '. Почему это? – user2438817

+0

Он должен быть связан с другим кодом, который вы написали. Вероятно, вам нужно задать другой вопрос и предоставить все необходимые сведения. –

+0

Привет, я исправил предыдущую ошибку и сделал это, как вы показали, но она все еще не работает. Когда я использую диспетчер ответов, до сих пор нет голоса. Должен ли я сделать ReplyManager подклассом или что-то в этом роде? – user2438817