Объект удаляется до вызова UIAlertView Delegate - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть два контроллера представления в стеке навигации.В первом контроллере представления у меня есть метод, который показывает предупреждение, чтобы перейти на веб-сайт и выйти из приложения.Если они нажимают НЕТ, ничего не происходит, если ДА, то открывается ссылка.Это все работает.Моя проблема теперь, если я хочу вызвать этот метод из второго контроллера представления в стеке навигации, мой первый контроллер представления получает 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 голосов
/ 23 ноября 2011

Я обнаружил, что если бы я создал свойство для dummyCtlr, объект оставался бы достаточно долго для вызова delgate.

0 голосов
/ 23 ноября 2011

Проверьте, является ли *dummyCtlr nil, а не dummyCtlr nil.

...