UIAlertView внутри viewWillDisappear не вызывает clickedButtonAtIndex - PullRequest
0 голосов
/ 26 октября 2011

У меня есть следующий код в классе, хотя предупреждение появляется в пользовательском интерфейсе (с использованием iOS SDK 5.0), когда представление собирается исчезнуть, метод clickedButtonAtIndex никогда не вызывается, и приложение завершается с "EXC_BAD_ACCESS". Я подтвердил, что представление использует / использует мой класс в качестве делегата.

Код находится в главном потоке, и после просмотра всех других ответов на эту тему я не могу понять, почему мой метод делегата никогда не вызывается. Я мог бы использовать другую подсказку.

  @interface ConnectionViewController : UIViewController <UIAlertViewDelegate> {
           ....
    }

@implementation ConnectionViewController
...

    - (void)viewWillDisappear:(BOOL)animated
    {
        connection = [Connection objectWithConnName:[connectionName text] host:[mtDevice text] user:[userName text] passwd:[userPassword text]];
        BOOL result = [connection test];
        if (result) {
            [[FirstViewController sharedInstance] addConnection:connection];    
        } else {
            UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"No Connection" message:@"Failed to connect to device" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ignore", @"Ok", nil];
            [alert show];
        }
    }

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
    {
        NSLog(@"clickedButtonAtIndex: %d",buttonIndex);
    }

Ответы [ 2 ]

1 голос
/ 26 октября 2011

Представление предупреждений не блокируется - по сути, к тому времени, когда вы выбираете опцию, ваш контроллер представления уже видел viewWillDisappear, viewDidDisappear и, вероятно, dealloc, то есть он больше не существует.Предполагая, что вы используете UINavigationController, если идея состоит в том, чтобы запросить пользователя перед переходом назад, вы должны переопределить

- (UINavigationItem *)popNavigationItemAnimated:(BOOL)animated;
{
    MyAppDelegateName* delegate = (MyAppDelegateName*)[[UIApplication sharedApplication] delegate];
    if([delegate.navigationController.topViewController conformsToProtocol:@protocol(ExitConfirmDelegate)]) {
       if([(UIViewController<ExitConfirmDelegate>*)delegate.navigationController.topViewController shouldConfirmExit]) {
            return;
       }
       [delegate.navigationController popViewControllerAnimated:animated];
    }
}

в вашем UINavigationBar, где ExitConfirmDelegate - это протокол с BOOL shouldConfirmExit.Ваш контроллер представления будет реализовывать этот протокол и возвращать «НЕТ», если вид ожидающего оповещения виден.Затем, когда пользователь щелкает опцию, просто снова вызовите popViewControllerAnimated из метода clickedButtonAtIndex.

0 голосов
/ 26 октября 2011

Убедитесь, что ConnectionViewController не выпущен до вызван метод clickedButtonAtIndex.

...