在调用UIAlertView Delegate之前,对象会被取消激活

时间:2011-11-22 19:58:24

标签: ios iphone objective-c uialertview uialertviewdelegate

我在导航堆栈上有两个视图控制器。在第一个视图控制器中,我有一个方法,显示转到网站并离开应用程序的警报。如果他们单击否,则没有任何反应,如果是,则打开链接。这一切都有效。我现在的问题是,如果我想从导航堆栈上的第二个视图控制器调用此方法,我的第一个视图控制器将被dealloc'd,并且委托永远不会被调用。这是一些正在发生的伪代码。

在SecondViewcontroller中:

- (void)TargetSelectionPressed:(NSNotification *)notification {

    FirstViewController *dummyCtlr = nil;
    BOOL shouldPushToFistCtlr = NO;

    NSArray *controllers = [[NSArray alloc] initWithArray:[self.navigationController viewControllers]];

    for (UIViewController *ctlr in controllers) {
        if ([ctlr isKindOfClass:[FirstViewController class]]) {
            dummyCtlr = (FirstViewController *)ctlr;
            break;
        }
    }
    if (dummyCtlr == nil) {
        FirstViewController *gtc = [[[FirstViewController alloc] init] autorelease];
        dummyCtlr = gtc;
        shouldPushToFistCtlr = YES;
    }

    switch (targetSelection) {
        case TARGET_LOCATION:
            break;
        case TARGET_CONDITION: {
            if (shouldPushToGTC) {
                [self.navigationController pushViewController:dummyCtlr animated:YES];
            }  
            else {
                [self.navigationController popToViewController:dummyCtlr animated:YES];
            }
            break;
        }
        case TARGET_LINK: {
            [dummyCtlr BuildURL:link];
            break;
        }
        default:
            break;
    }
    [controllers release];
}

FirstViewcontroller

- (void)BuildURL:(NSString* )link {
    self.ExternalLink = link;     NSString *message = [[NSString alloc] initWithFormat:@"Would you like to open %@ in Safari?", link];
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Open Safari" message:message delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
    [alert show];
    self.SafariAlertView = alert;
    self.SafariAlertView.delegate = self;
    [alert release];
    [message release];
}

- (void)dealloc {
    [safariAlertView release];
    self.SafariAlertView.delegate = nil;
    [super dealloc];
}

2 个答案:

答案 0 :(得分:0)

检查*dummyCtlrnil而不是dummyCtlrnil

答案 1 :(得分:0)

我发现如果我为dummyCtlr创建了一个属性,那么该对象将保持足够长的时间来调用delgate。