UIAlertViewDelegate未按预期运行

时间:2012-10-20 15:05:37

标签: iphone objective-c ios

我有一个非常简单的过程,在每轮简单游戏之后,计算分数,标签更新以及所有正常,非常简单的东西。我有一个UIAlertView,告诉玩家他/她的表现。我使用UIAlertViewDelegate推迟所有更新,重置控件等,直到UIAlertView被解除。方法是[startNewRound],[startOver]和[updateLabels]。它们都做得很明显。无论如何,当用户击中第十轮时,我已经制作了另一个UIAlertView,通知玩家游戏已经结束并显示总体得分。再次,我希望使用一个代表推迟重置,直到AlertView被解雇。唯一的问题是,使用endGame AlertView,它似乎使用第一个AlertView的委托方法,导致游戏继续新一轮而不是从头开始。我希望这是有道理的。无论如何,这里是我的代码的片段。

if (round == 10){
    UIAlertView *endGame = [[UIAlertView alloc]
                            initWithTitle: @"End of Game"
                            message: endMessage
                            delegate:self
                            cancelButtonTitle:@"New Game"
                            otherButtonTitles:nil];
    [endGame show];
}
else {
    UIAlertView *alertView = [[UIAlertView alloc]
                          initWithTitle: title
                          message: message
                          delegate:self
                          cancelButtonTitle:@"Next"
                          otherButtonTitles:nil];

    [alertView show];
}

然后是委托方法:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [self startNewRound];
    [self updateLabels];
}

- (void)endGame:(UIAlertView *)endGame didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    [self startOver];
}

就是这样。正如我所提到的,endGame AlertView似乎使用了alertView的委托,因此没有激活[self startOver]方法。所有方法都有效,只是AlertView使用了不正确的委托方法。

问候,
迈克

2 个答案:

答案 0 :(得分:2)

像这样更改你的代码,

    if (round == 10){
        UIAlertView *endGame = [[UIAlertView alloc]
                                initWithTitle: @"End of Game"
                                message: endMessage
                                delegate:self
                                cancelButtonTitle:@"New Game"
                                otherButtonTitles:nil];
        endGame.tag = 111;
        [endGame show];
    }
    else {
        UIAlertView *alertView = [[UIAlertView alloc]
                              initWithTitle: title
                              message: message
                              delegate:self
                              cancelButtonTitle:@"Next"
                              otherButtonTitles:nil];
        alertView.tag = 222;
        [alertView show];
    }

并将方法委托为,

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
    {
        if(alertView.tag == 111)
        {
            [self startNewRound];
            [self updateLabels];
        }
        else if(alertView.tag == 222)
        {
            [self startOver];

        }
     }

答案 1 :(得分:1)

您不能使用dismisswithbuttonindex两种委托方法,您需要使用标记来处理这种情况。

为两个警报视图提供不同的标记,并在委托对象上进行检查。因此,您可以区分两个警报视图。