IOS:如何在循环内使用UIAlertView

IOS:如何在循环内使用UIAlertView,ios,objective-c,cocoa-touch,uialertview,Ios,Objective C,Cocoa Touch,Uialertview,我已经研究这个问题一段时间了,但找不到有效的解决方案。我正在创建一个游戏,每个玩家都有一个随机的名字。在游戏结束时,如果一个或多个玩家的得分符合所有时间排行榜的要求,我想循环浏览所有玩家,显示一个UIAlertView,让他们输入真实姓名,然后将该姓名保存回我的玩家对象。但是,我无法停止循环,显示警报视图,等待响应,然后继续。有人能帮我吗 这是我的循环: for (int i = 0; i < [leaderboard count]; i++) { NSDictionary *pl

我已经研究这个问题一段时间了,但找不到有效的解决方案。我正在创建一个游戏,每个玩家都有一个随机的名字。在游戏结束时,如果一个或多个玩家的得分符合所有时间排行榜的要求,我想循环浏览所有玩家,显示一个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"];
    }
}
for(int i=0;i<[排行榜计数];i++){
NSDictionary*player=[[NSDictionary alloc]initWithDictionary:[排行榜对象索引:i]];
如果([[player valueForKey:@“isCurrentPlayer”]IseQualtString:@“YES”]){
//getRealPlayerName接受name参数并显示alertview
[self-performSelectorOnMainThread:@selector(getRealPlayerName:)with object:[player valueForKey:@“playerName”]waitUntilDone:是];
//nameFromAlertView是当用户在alertview中输入名称时设置的局部变量。
[玩家设置值:[来自AlertView的自我名称]forKey:@“玩家名称”];
[player setValue:@“forKey:@“isCurrentPlayer”];
}
}

当程序控件返回主运行循环时,仅显示警报视图并处理事件。因此等待

[self performSelectorOnMainThread:@selector(getRealPlayerName:) withObject:[player valueForKey:@"playerName"] waitUntilDone:YES];
完全阻止显示警报视图

您可以做的是:

  • 为第一个玩家启动警报视图
  • alertView:didDismissWithButtonIndex:
    delegate函数中,记录数据并为下一个播放机(如果不是最后一个播放机)启动新的警报视图

您必须将当前玩家索引存储在类的属性中。或者,您可以将当前索引分配给
myAlertView.tag

您不能在循环中执行此操作

而是将用户和点保存在数组中,调用显示UIAlertView的方法。从阵列中获取第一个用户信息,并从阵列中删除这些信息。设置警报视图的委托。输入第一个信息后,将调用UIAlertView的委托方法(
alertView:didDismissWithButtonIndex:
)。在这里,你处理输入的信息,然后检查数组中是否还有其他内容,如果有,再次调用第一个方法



如果您熟悉块,还可以使用第三方代码,该代码允许使用块而不是委派。但在这些块中,您将执行基本相同的操作:只要阵列中的用户未被处理,就调用另一个块


新增内容之一:

感谢您的回复。我很困惑,如果不使用循环,如何为每个玩家启动alertview。@Weston:你不能在循环中完成。启动第一个玩家的警报视图。完成后(
didDismissWithButtonIndex
被调用),您将为下一个玩家启动警报视图。我是否正确理解,多个玩家将使用一个设备?@vikingosegundo,是的,玩家将使用相同的设备。您可以在循环中完成(通过利用信号量和后台队列),但您不想,相信我。你正在试图对抗框架,让它来帮助你。代码+1(我认为我们的想法大致相同)。我会删除委托函数中的对象,这样您就知道调用委托的当前用户,但这只是一个小问题。这是我使用的基本逻辑,它工作得很好。显然,我必须做一些tweek来保存用户输入的数据。
-(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];
    }
}