0

ゲームのメイン メニューとゲーム自体の間を移動していて、ロード画面が必要です。現在の動作では、[再生] ボタンをタップすると、数秒間動きがなく、セグエも発生せず、その後ゲームが開始されます。

一時的に、私は を吐き出し、UIActivityIndicatorView手動で に伝えてからstartAnimating、別のシーンへのセグエを呼び出しています。問題は、ゲーム ビュー (セグエのエンドポイント) のコードが、ビューが画面上で物理的に変更される前に実行されていることです (つまり、ゲームのコードが実行されている間にメニューが表示されます)。セグエが呼び出される前にスピナーが表示されるように指示されているため、これがどのように発生するかはよくわかりません。コードは次のとおりです。

- (IBAction) startGame: (id) sender
{
    [_loadingView setHidden: NO];
    [_loadingSpinner startAnimating];
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}

実際に時間を取っているものは、セグエが完了するまで呼び出されません (つまり、ゲームのメイン ビューがまったく別ViewControllerの方法で画面に表示されるまで (SQLite データベースをクエリしている))、その作業が終わるまでスピナーが表示されないのはなぜですか?されましたか?これにはGCDなどを使用する必要がありますか? 少し試してみましたが、現時点では私のレベルを少し上回っているかもしれません。重いコードは 1 つのメソッドに含まれているため、理想的には、文字通り行を順番に実行する、このようなことができるようにしたいと考えています。

[spinner startAnimating];
[self callMethodThatTakesAges];
[spinner stopAnimating];

を使用してみましperformSelectorOnMainThread:withObject:waitUntilDone:たが、2 つのビューの間で混乱しているようです。スピナーは、メニュー ビューではなく、ゲーム ビューに表示する必要があります。理想的には、[再生] をタップすると、ゲーム ビューへの遷移が瞬時に行われ、スピナーが表示され、読み込みが開始され、完了するとスピナーが消えるはずです。

何か案は?ありがとう!

EDIT:これは私のゲームビューコントローラからのいくつかの方法makeNewWordです(面倒な方法です)。

- (void) viewDidAppear: (BOOL) animated
{
    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle: UIActivityIndicatorViewStyleWhiteLarge];
    [spinner setCenter: CGPointMake(240, 55)];
    [self.view addSubview: spinner];
    [spinner startAnimating];
    [self makeNewWord];
    [spinner stopAnimating];
    [self becomeFirstResponder];

}

- (void) viewDidLoad
{
    [super viewDidLoad];
    [self canBecomeFirstResponder];

    firstLetterMultiplierLetter = [[NSString alloc] init];
    userIsEnteringAWord = NO;

    [self setUpGestures];
}

これは、ゲーム ビューに続くメイン メニュー ビューから呼び出されるメソッドです。

- (IBAction) startGame: (id) sender
{
    [self performSegueWithIdentifier: @"PlayGame" sender: self];
}
4

1 に答える 1

0

あなたの質問からあなたがどこに何を持っているかを伝えるのは難しいです. 私はあなたがこれをしたいと思います:

1) add the spinner to the game view 
2) in game view viewDidAppear, have [spinner startAnimating];
3) call [self methodThatTakesAges] (as the next line in viewDidAppear).
4) call [spinner stopAnimating] from whatever call back method you have in methodThatTakesAges

startGame: メソッド内の唯一のものは performSegue 行でなければなりません。ダウンロードを開始する場所を私が言った場所に変更する必要があるかもしれませんが、今どこから開始しているのかは明確ではありません。

于 2013-01-28T00:44:22.737 に答える