2013-03-24 47 views
1

我一直对这个问题有一段时间了,并不能找到一个可行的解决方案的UIAlertView中。我正在创建一个游戏,每个玩家被分配一个随机名称。在游戏结束时,如果一个或多个玩家有符合他们为所有的时间排行榜分数,我想遍历所有的球员,显示UIAlertView中,他们可以输入自己的真实姓名,然后保存该名称回我的播放器对象。但是,我无法停止循环,显示警报视图,等待响应,然后继续。有人可以帮我吗?IOS:如何使用内循环

继承人我的循环:

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"]; 
    } 
} 
+0

难道我理解正确的话,这几名球员将使用一台设备? – vikingosegundo 2013-03-24 18:15:32

+0

@vikingosegundo,是的,玩家将使用相同的设备。 – Weston 2013-03-24 18:31:58

+0

你_can_做一个循环(通过利用一个信号和背景队列),只有你不想,相信我。你正在努力争取这个框架,让它帮助你。 – magma 2013-03-24 19:37:37

回答

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]; 
    } 
} 

如果您熟悉块,你可以也使用第三方代码,它允许使用块而不是委托。但是在块中你可以做基本相同的操作:调用另一个块作为数组中的长用户未处理。

其中一个加法:Mugunth Kumar — Block Based UIAlertView and UIActionSheet

+1

代码+1(我认为我们有大致相同的想法)。我将删除委托函数中的对象,以便您知道调用委托的当前用户,但这仅仅是一个小品味。 – 2013-03-24 18:22:14

+0

这是我使用的基本逻辑,它工作得很好。很明显,我不得不做一些tweeks,允许我保存用户输入的数据。 – Weston 2013-04-03 15:38:04

1

警报视图只显示与处理的事件当程序控制返回到主runloop。因此在等待

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

阻止警报视图根本不显示。

你可以做的是:

  • 启动的第一个球员的警报视图。
  • alertView:didDismissWithButtonIndex:委托功能,记录数据,并开始为下一个玩家一个新的警报视图(如果不是最后的球员)。

您必须将当前玩家指数存储在您班级的某个属性中。或者,您可以将当前索引分配到myAlertView.tag

+0

感谢您的回复。我很困惑我将如何开始每个玩家的alertview,而不使用循环。 – Weston 2013-03-24 18:15:14

+0

@韦斯顿:你不能在一个循环中做到这一点。您为第一个玩家启动警报视图。当完成时('didDismissWithButtonIndex'被调用),你开始下一个玩家的警报视图。 – 2013-03-24 18:16:40

+0

+1在同一分钟内采用相同的方法。 – vikingosegundo 2013-03-24 18:34:25