1

私はしばらくの間この問題に取り組んできましたが、うまくいく解決策を見つけることができません。各プレイヤーにランダムな名前が付けられるゲームを作成しています。ゲームの終了時に、1人以上のプレーヤーが常にリーダーボードの資格を得るスコアを持っている場合は、すべてのプレーヤーをループして、本名を入力できるUIAlertViewを表示し、その名前をに保存し直します。私のプレーヤーオブジェクト。ただし、ループを停止してアラートビューを表示し、応答を待ってから続行することはできません。誰かが私を助けることができますか?

これが私のループです:

for (int i = 0; i < [leaderboard count]; i++) {
    NSDictionary *player = [[NSDictionary alloc] initWithDictionary:[leaderboard objectAtIndex:i]];
    if ([[player valueForKey:@"isCurrentPlayer"] isEqualToString:@"YES"]){
        // getRealPlayerName takes in a name parameter and displays an alertview
        [self performSelectorOnMainThread:@selector(getRealPlayerName:) withObject:[player valueForKey:@"playerName"] waitUntilDone:YES];
        // nameFromAlertView is a local variable that is set when the user enters a name in the alertview.
        [player setValue:[self nameFromAlertView] forKey:@"playerName"];
        [player setValue:@"" forKey:@"isCurrentPlayer"];
    }
}
4

2 に答える 2

2

ループでそれを行うことはできません。

代わりに、ユーザーとポイントを配列に保存し、UIAlertViewを表示するメソッドを呼び出します。アレイから最初のユーザー情報を取得し、それらの情報をアレイから削除します。アラートビューのデリゲートを設定します。最初の情報が入力されると、UIAlertViewのデリゲートメソッドが呼び出されます(alertView:didDismissWithButtonIndex:)。配列にまだ何かがあるかどうかを確認するよりも、入力された情報を処理します。ある場合は、最初のメソッドを再度呼び出します。


-(void)promptForInput
{
    self.currentUserInfo = userArray[0]; //userarray is mutable, self.currentUserInfo is a property for the current user
    [userArray removeObject:self.currentUserInfo];
    //configure UIAlertView
    alertView.delegate = self;

}


//once the user hit a altertview button, this delegate method gets called
-(void)alertView:(UIAlertView)alertView didDismissWithButtonIndex:(NSUInteger)idx
{
     //save/process entered data, self.currentUserInfo hold the current user.

    if([userArray count]> 0){
        [self promptForInput];
    }
}

ブロックに精通している場合は、委任の代わりにブロックを使用できるサードパーティのコードを使用することもできます。ただし、ブロックでは基本的に同じことを行います。配列内のユーザーが処理されていない限り、別のブロックを呼び出します。

それらの追加の1つ:Mugunth Kumar —ブロックベースのUIAlertViewおよびUIActionSheet

于 2013-03-24T18:06:54.710 に答える
1

アラートビューは、プログラムコントロールがメインの実行ループに戻ったときにのみ表示され、イベントが処理されます。したがって、で待っています

[self performSelectorOnMainThread:@selector(getRealPlayerName:) withObject:[player valueForKey:@"playerName"] waitUntilDone:YES];

アラートビューがまったく表示されないようにブロックします。

あなたができることは次のとおりです。

  • 最初のプレーヤーのアラートビューを開始します。
  • デリゲート機能で、alertView:didDismissWithButtonIndex:データを記録し、次のプレーヤーの新しいアラートビューを開始します(それが最後のプレーヤーでない場合)。

現在のプレーヤーインデックスをクラスのプロパティに保存する必要があります。または、現在のインデックスをに割り当てることもできますmyAlertView.tag

于 2013-03-24T18:06:11.537 に答える