0

2 つのビューで構成されるシンプルなアプリがあります。上面図には加速度計の代表者がいます。トップビューが画面上にあるときにユーザーが揺れたとき。次に、pushviewcontroller が呼び出され、サブビューが表示されます。問題は、サブビューが表示されたときです。シェイクすると、それでもシェイクアクションがキャッチされ、エラーが発生します。だから私を助けてください。前もって感謝します。

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
const float violence = 1.2;
static BOOL beenhere;
BOOL shake = FALSE;

if (beenhere) return;
beenhere = TRUE;

if (acceleration.x > violence || acceleration.x < (-1* violence))
    shake = TRUE;
if (acceleration.y > violence || acceleration.y < (-1* violence))
    shake = TRUE;
if (acceleration.z > violence || acceleration.z < (-1* violence))
    shake = TRUE;
if (shake) {
    [self playSound:@"suzu"];

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"noVib"] == NO) {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    [self presentModalViewController:mMoviePlayer animated:YES];
    [self play]; 
}

play メソッドが呼び出されてビデオが終了すると、pushviewcontroller が呼び出され、サブビューが表示されます

以下は、すべてのムービープレーヤーを処理するクラスです。

- (void) initPlayer{
if (mMoviePlayer != nil){
    [mMoviePlayer release];
}

mMoviePlayer = [[MoviePlayerViewController alloc] initWithContentURL:[self createURL]];
[[NSNotificationCenter defaultCenter] removeObserver:mMoviePlayer 
                                                name:MPMoviePlayerPlaybackDidFinishNotification object:mMoviePlayer.moviePlayer];
[mMoviePlayer.moviePlayer setShouldAutoplay:NO];
mMoviePlayer.moviePlayer.backgroundView.backgroundColor = [UIColor blackColor];
mMoviePlayer.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
mMoviePlayer.moviePlayer.controlStyle = MPMovieControlStyleNone;

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(moviePlayBackDidFinish:) 
                                             name:MPMoviePlayerPlaybackDidFinishNotification 
                                           object:mMoviePlayer.moviePlayer];

[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(moviePreloadDidFinish:) 
                                             name:MPMoviePlayerLoadStateDidChangeNotification 
                                           object:mMoviePlayer.moviePlayer];

- (void) moviePlayBackDidFinish:(NSNotification*)notification

{

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:NO];        
[[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:MPMoviePlayerPlaybackDidFinishNotification
                                              object:mMoviePlayer.moviePlayer];
[self dismissModalViewControllerAnimated:YES];
[mMoviePlayer release];
mMoviePlayer = nil;
[self toNext];

}

4

1 に答える 1

1

最初に頭に浮かぶのは、mMoviePlayer がプッシュされたかどうかを追跡することです。

if (shake && mPlayerPushed) {
    [self playSound:@"suzu"];

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"noVib"] == NO) {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }
    [[UIAccelerometer sharedAccelerometer] setDelegate:nil];
    [self presentModalViewController:mMoviePlayer animated:YES];
    [self play]; 
    mPlayerPushed = YES;
}

moviePlayBackDidFinish メソッドで、dismissModalViewControllerAnimated:YES を呼び出した後、mPlayerPushed を NO に設定する必要があります。

または、プロパティ モーダル ビュー コントローラーを使用して、モーダル ビューが表示されているかどうかを確認できます。これはまだテストしていませんが、動作するはずです。

modalViewController: アクティブなモーダル ビューのコントローラー。つまり、レシーバーによって管理されるビューの上に一時的に表示されるビューです。(読み取り専用)

@property(nonatomic, readonly) UIViewController *modalViewController

したがって、bool mPlayerPushed の代わりに次のようになります。

if(shake && something.modalviewController == nil){ present mMoviePlayer }
于 2012-07-24T06:13:22.707 に答える