1

ボタンが2つ付いているものを持っていUIAlertViewます。しかし、私はそのclickedButtonAtIndexイベントを取得できません。問題は、 - (void)deallocメソッドが時期尚早に呼び出され、デリゲートを nil に設定したためです。そのため、アラート ビュー ボタンのクリックを処理できませんでした。この理由は何でしょうか。

編集: 私のコードには 2 つのフロー方向があります。1 つのフロー方向では、正常に動作しています。dealloc メソッドは正しい方法で呼び出されています。ビューが早期にリリースされても問題ありません。

しかし、2 番目のフローでは、この問題が発生します。今のところ、私が理解している[self retain]のは、ビューが時期尚早に解放された場合に UIAlertView デリゲートを設定する必要があるということです。しかし、最初のフローを妨げないように、ビューが解放されているか保持されているかを確認するにはどうすればよいでしょうか?

コードの関連部分を投稿しています。これは、ビューの割り当てが解除される場所だと思います。

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    if(actionSheet.tag == 102)
    {
        if(buttonIndex == 0)
        {
            [self.infoView removeFromSuperview]; 
            self.isSaveInfo = NO;
            [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton.target];  //This is where the view is getting released.

            if([[NSBundle mainBundle] loadNibNamed:@"UploadView" owner:self options:nil])
            {
                [self.uploadView setFrame:CGRectMake(0, 0, 320, 480)];

                [[UIApplication sharedApplication].keyWindow addSubview:self.uploadView];
            }
            [self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0];
       }

       if(buttonIndex == 1)
       {
           [self.infoView removeFromSuperview];
           self.isSaveInfo = YES;

           [[NSNotificationCenter defaultCenter] removeObserver:self];
           [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadSaveButton) name:@"callThisMethod" object:nil];

           MyInfoViewController *myInfoViewController = [[MyInfoViewController alloc]initWithNibName:@"MyInfoViewController" bundle:nil];
           self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil] autorelease];
           [self.navigationController myInfoViewController animated:YES];
           [myInfoViewController release];
       }
   }
}


-(void)RemoveView
{
    if([MyViewController OnSave])
    {
        self.testAlert = [[[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:nil]autorelease];
        self.testAlert.tag = 1;
        [self.testAlert show];
        [MyViewController setValue:NO];
    }
    else
    {
        self.testAlert = [[[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil]autorelease];
        self.testAlert.tag = 2;
        [self.testAlert show];
    }
}

-(void)loadSaveButton
{
    [doneButton.target performSelector:doneButton.action];

    if([[NSBundle mainBundle] loadNibNamed:@"UploadView" owner:self options:nil])
    {
        [self.uploadView setFrame:CGRectMake(0, 0, 320, 480)];
        [[UIApplication sharedApplication].keyWindow addSubview:self.uploadView];

    }
    [self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0];
}

ボタン 0 インデックス内のコードUIActionSheetは、ビューの割り当てが解除されている場所であり、ボタン 1 インデックスは正常に機能しています。

4

2 に答える 2

3

dealloc メソッドが時期尚早に呼び出されている場合は、まだビューを保持する必要がある場所がどこかにある可能性があります。ただし、コードの詳細を知らなければ、それがどこにあるのかはわかりません。

于 2012-06-06T15:35:15.940 に答える
0

このコードが問題だったと思います。

[self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0];

ここでは、withObject:nilの代わりにwithObject:selfを使用する必要がありました。これにより、リリースの問題が解決されたようです。

于 2012-06-08T05:38:42.917 に答える