1

アプリでこのコードを実行すると、iOS 6 でアプリがクラッシュします。

// Another method
[NSThread detachNewThreadSelector:@selector(askServerForNFeID)
          toTarget:self withObject:nil];

- (void)askServerForNFeID {
    if ([response isEqualToString:@"XXXX"]) {
        NSString *responseMessage = [NSString stringWithFormat:
                                       NSLocalizedString(@"Autorizado o Uso da NFe\n para chave:\n%@", @""),
                                       [invoiceInfo NFeID]];

        UIAlertView *alert = [[UIAlertView alloc]
               initWithTitle:NSLocalizedString(@"Sefaz respondeu:", @"")
                     message:responseMessage
                    delegate:self
           cancelButtonTitle:NSLocalizedString(@"OK", @"")
           otherButtonTitles:nil];

        [alert show];
        [alert release];
    }
}

2 番目のスレッドからアラートを呼び出すとクラッシュが発生することがわかったので、次のようにメイン スレッドからアラートを呼び出すようにコードを変更しました。

if ([response isEqualToString:@"XXXX"]) {

    [self performSelectorOnMainThread:@selector(showAlertHelper:)
          withObject:[[NSArray alloc] initWithObjects:
            NSLocalizedString(@"Não posso seguir em frente", @""),
            NSLocalizedString(@"Você usou .....", @""), @"Fechar", @"Comprar", nil]
            waitUntilDone:YES];

タイトル、メッセージ、ボタンをリストとして解析して、showAlertHelper...

-(void)showAlertHelper:(NSArray*)theArray{

    if ([[theArray objectAtIndex:3] isEqualToString:@""]) {
        UIAlertView *alertView = [[UIAlertView alloc]
              initWithTitle:[theArray objectAtIndex:0]
                    message:[theArray objectAtIndex:1]
                   delegate:nil
          cancelButtonTitle:[theArray objectAtIndex:2]
          otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }
    else {
        UIAlertView *alertView = [[UIAlertView alloc]
             initWithTitle:[theArray objectAtIndex:0]
                   message:[theArray objectAtIndex:1]
                  delegate:nil
         cancelButtonTitle:[theArray objectAtIndex:2]
         otherButtonTitles:[theArray objectAtIndex:3], nil];

        [alertView show];
        [alertView release];
    }
}

私の問題は、タップされたボタンをキャッチするためにこのハンドラーがあり、それが機能しなくなったことです。呼び出されていないだけです:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];

    if ([title isEqualToString:NSLocalizedString(@"Comprar", @"")]) {
        // Do stuff to buy credits...
    } else if ([title isEqualToString:NSLocalizedString(@"Fechar", @"")]) {
        NSLog(@"Fechar was selected.");
    }
    else if ([title isEqualToString:NSLocalizedString(@"Criar conta", @"")]) {
         // Do stuff to create an account...
    }
}
4

2 に答える 2

2

UIAlertView の作成メソッドからデリゲートを削除しました

UIAlertView *alertView = [[UIAlertView alloc]
         initWithTitle:[theArray objectAtIndex:0]
               message:[theArray objectAtIndex:1]
              delegate:nil
     cancelButtonTitle:[theArray objectAtIndex:2]
     otherButtonTitles:[theArray objectAtIndex:3], nil];

する必要があります

UIAlertView *alertView = [[UIAlertView alloc]
         initWithTitle:[theArray objectAtIndex:0]
               message:[theArray objectAtIndex:1]
              delegate:self
     cancelButtonTitle:[theArray objectAtIndex:2]
     otherButtonTitles:[theArray objectAtIndex:3], nil];
于 2012-09-21T21:10:46.823 に答える
2

問題は、書き直したメソッドで、デリゲートをnilではなく に設定することですself。その結果、alertView:clickedButtonAtIndex:デリゲート メソッドは呼び出されません。パラメータで指定selfして、コードを次のように変更します。delegate:

-(void)showAlertHelper:(NSArray*)theArray{

    if ([[theArray objectAtIndex:3] isEqualToString:@""]) {
        UIAlertView *alertView = [[UIAlertView alloc]
              initWithTitle:[theArray objectAtIndex:0]
                    message:[theArray objectAtIndex:1]
                   delegate:self
          cancelButtonTitle:[theArray objectAtIndex:2]
          otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    } else {
        UIAlertView *alertView = [[UIAlertView alloc]
             initWithTitle:[theArray objectAtIndex:0]
                   message:[theArray objectAtIndex:1]
                  delegate:self
         cancelButtonTitle:[theArray objectAtIndex:2]
         otherButtonTitles:[theArray objectAtIndex:3], nil];

        [alertView show];
        [alertView release];
    }
}
于 2012-09-21T21:10:55.147 に答える