-1

以下は、View Controller でアラートを表示するためのコードです。

-(void)saveProducts {
    pData = [[JsonModel sharedJsonModel] prodData];
    if ([pData count] == 0 && [self respondsToSelector:@selector(alertView:clickedButtonAtIndex:) ]  ) {
        alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"No products against this category" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
    }


    [self.tblView reloadData];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if (buttonIndex == 0) {
        [self.navigationController popViewControllerAnimated:YES];
        [actInd stopAnimating];
    }

}

ただし、遅いネットワークでは、アラートはゆっくりと届きます。その間にナビゲーション バーの戻るボタンをクリックすると、ナビゲーション コントローラーがポップされ、新しいビュー コントローラーにアラートが表示されます。しかし、[OK] をクリックすると、EXC_BAD_ACCESS エラーでアプリが突然クラッシュします。私も試しました

didDismissWithButtonIndex

の代わりに関数

clickedButtonAtIndex

しかし、同じエラーが発生します。私を助けてください

バックバーボタンをクリックしなければ正常に動作します。最初のView Controllerアラートが2番目のView Controllerに表示された場合にのみ問題が発生します

EDIT これはエラーレポートです * -[ProductsListing alertView:didDismissWithButtonIndex:]: 割り当て解除されたインスタンス 0x8478280 に送信されたメッセージ

編集 私は問題を理解しています。[戻る] ボタンをクリックすると、アラート デリゲートの割り当てが解除され、デリゲートの呼び出し結果がエラーになります。どうすればこれを克服できますか?

4

3 に答える 3

2

私の推測では、'self.navigationController' または 'actInd' のいずれかが既にリリースされていると思います。また、「UIAlertView」でメモリ リークが発生します (ARC を使用していない場合)。Instruments を使用してアプリをプロファイリングし、「ゾンビ」ツールを選択して、何が表示されるかを確認します。

于 2013-02-12T12:34:58.730 に答える
0

あなたがここで問題を説明したことから、これが可能性があります(ワイルドな推測)

[actInd stopAnimating];

viewController が削除された (ポップされた) 後に呼び出されactIndます。有効なメモリがない可能性があるため、クラッシュします。

このようにメソッドの内容を変更して確認します

if (buttonIndex == 0) {
        [actInd stopAnimating];
        [self.navigationController popViewControllerAnimated:YES];
    }
于 2013-02-12T12:33:11.130 に答える
0

私はあなたが変わらなければならないと信じています

[alert show];

if(self.view.window){
   [alert show];
}

このようにして、コントローラ(ビュー)がまだ画面に表示されている場合にのみアラートが表示されます(なぜユーザーに前の画面からのアラートを表示させるのですか?)とにかくアラートを表示したい場合....その後、「古い」コントローラ問題が発生したことを「新しい」コントローラーに通知する必要があります...そして、ユーザーに通知するのは新しいコントローラーの仕事です。

または、この部分を変更してみてください

    [self.navigationController popViewControllerAnimated:YES];
    [actInd stopAnimating];  

if(self.view.window){
    [self.navigationController popViewControllerAnimated:YES];
    [actInd stopAnimating]; // im not sure where the animation is...so not sure if this shoulb be in here or not
}
于 2013-02-12T13:15:27.827 に答える