2

プロジェクトに textToSpeech を実装しましたが、テキストが読み上げられている間にアラートビューを表示したいと考えています。ここで、textToSpeech のメソッドを呼び出しています。

//-----before TTS starts i try to display alertView with Cancelbutton  
//[self performSelectorOnMainThread:@selector(alertWhileTTS) withObject:nil waitUntilDone:YES]; //gray view and no alertview
//[self performSelector:@selector(alertWhileTTS)];  //gray view and no alertview
//[self alertWhileTTS];  //gray view and no alertview

//this part here is blocking, no gray screen, 
//after TTS is ready, the alertView is displayed
dispatch_async(dispatch_get_main_queue(), ^{
        //Update UI if you have to
        [self alertWhileTTS];
    });


[[self view] setNeedsDisplay];
[self synthesizeInBackground];
[queue waitUntilAllOperationsAreFinished];
[self setIsSpeaking: false];
[[self view] setNeedsDisplay];  

ここで、 synthesizeInBackground メソッド ( in メソッド synthesize は TTS を開始します):

- (void) synthesizeInBackground {
    queue = [[NSOperationQueue alloc] init];
    operation = [[NSInvocationOperation alloc] initWithTarget:self 
    selector:@selector(synthesize) object:nil];

    [queue addOperation: operation];
}  

TTS の間、ボタン付きの alertView を表示したいと考えていcancelます。しかし、私の場合、alertView がないと灰色の画面しか表示されません。

alertWhileTTS を正しく呼び出すにはどうすればよいですか?

alertWhileTTS の内容は次のとおりです。

- (void) alertWhileTTS {
UIAlertView *inboxRead = [[[UIAlertView alloc] initWithTitle:@"Inbox tts..."
                                                    message:nil
                                                   delegate:self
                                          cancelButtonTitle:@"Abbrechen"
                                          otherButtonTitles:nil] autorelease];
inboxRead.tag = 997;

[inboxRead show];
}  

UPDATEは、私のソリューションを参照してください。

[self performSelectorOnMainThread:@selector(alertWhileTTS) withObject:nil waitUntilDone:YES];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, (unsigned long)NULL), ^(void) {
        [[self view] setNeedsDisplay];
        [self synthesizeInBackground];
        [queue waitUntilAllOperationsAreFinished];
        [self setIsSpeaking: false];
        [[self view] setNeedsDisplay];

    }); 
4

2 に答える 2

1

すべてを自動的に解放するため、自動参照カウント (ARC) を使用する必要があります。Borrden が述べたように、(おそらく) UIAlertView をすぐにリリースしています。

于 2012-06-05T14:44:19.693 に答える
1

alertWithTTsTo を変更する

UIAlertView *inboxRead = [[[UIAlertView alloc] initWithTitle:@"Inbox tts..."
                                                    message:nil
                                                   delegate:self
                                          cancelButtonTitle:@"Abbrechen"
                                          otherButtonTitles:nil] autoRelease];
inboxRead.tag = 997;

[inboxRead show];

alertWhileTTSまた、メインのUIスレッドから関数を呼び出すことを忘れないでください

 dispatch_async(dispatch_get_main_queue(), ^{
        //Update UI if you have to
        [self alertWhileTTS];
    });
于 2012-06-05T14:47:09.707 に答える