Почему не работает UIAlertView?

Я тестирую этот фрагмент кода, но когда я его запускаю, он не запускает UIAlertView. Когда код достигает If (ongoingGame = YES) и NSLog, он переходит непосредственно к «otherButtonTitles: nil» без выполнения UIAlertView.

Может кто-нибудь объяснить мне, почему он не запускает его?

    -(IBAction)continueGame_button:(id)sender {
    //=====CHECK IF THERE IS AN ON-GOING GAME, IF SO CONTINUE=====//
    AccessCurrentGameData *isThereAnOngoingGameFunction = [AccessCurrentGameData new];
    BOOL ongoingGame = [isThereAnOngoingGameFunction checkIfGameOngoing];
    [isThereAnOngoingGameFunction release];
    NSLog(@"+ + +continueGame_button+ + +");
    NSLog(@"ongoingGame = %@\n", (ongoingGame ? @"YES" : @"NO"));

    if (ongoingGame == YES) {
        NSLog(@"++++++++++++++++++");
        NSLog(@"++++++++++++++++++");
        NSLog(@"++++++++++++++++++");
        NSLog(@"++++++++++++++++++");
        NSLog(@"++++++++++++++++++");

        // 
        UIAlertView *continueGame = [[UIAlertView alloc] initWithTitle:@"Fortsätta spel"
                                                              message:@"Det finns ett aktivt spel, klicka Spela eller Tillbaka"
                                                             delegate:self 
                                                    cancelButtonTitle:@"Tillbaka" 
                                                    otherButtonTitles:nil];

        [continueGame show];
        [continueGame release];


    }

    exit(0);
}

person PeterK    schedule 09.02.2011    source источник


Ответы (4)


Ваш код оповещения прекрасен. Я постоянно использую эту форму (три строки — init, show, release) для создания оповещений.

Я предполагаю, что exit(0) является корнем проблемы. Если вы хотите выйти после того, как пользователь закроет оповещение, вам следует назначить делегата, который закроет приложение, когда пользователь нажмет кнопку закрытия. Используйте свой код, но удалите exit(0). Затем реализуйте UIAlertViewDelegate следующим образом:

-(IBAction)continueGame_button:(id)sender {
    //=====CHECK IF THERE IS AN ON-GOING GAME, IF SO CONTINUE=====//
    AccessCurrentGameData *isThereAnOngoingGameFunction = [AccessCurrentGameData new];
    BOOL ongoingGame = [isThereAnOngoingGameFunction checkIfGameOngoing];
    [isThereAnOngoingGameFunction release];
    NSLog(@"+ + +continueGame_button+ + +");
    NSLog(@"ongoingGame = %@\n", (ongoingGame ? @"YES" : @"NO"));

    if (ongoingGame == YES) {
        NSLog(@"+++++++++ ONGOING GAME +++++++++");

        // 
        UIAlertView *continueGame = [[UIAlertView alloc] initWithTitle:@"Fortsätta spel"
                                                              message:@"Det finns ett aktivt spel, klicka Spela eller Tillbaka"
                                                             delegate:self 
                                                    cancelButtonTitle:@"Tillbaka" 
                                                    otherButtonTitles:nil];

        [continueGame show];
        [continueGame release];
    }
}

- (void) alertViewCancel:(UIAlertView *)alertView{
  //If you have other alerts, you may want to check the title of the alert to
  //make sure that you only exit when THIS alert is dismissed  
  exit(0);
}

Не забудьте добавить код <UIAlertViewDelegate> в файл заголовка (.h).

Вы также можете использовать - (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex, если вам нужно несколько кнопок, одна из которых является специальной кнопкой «Выход».

Обратите внимание, что Apple не рекомендует использовать exit() в приложениях, выпущенных в App Store, и его использование может привести к отклонению вашего приложения.

person Moshe    schedule 09.02.2011
comment
выход есть только для сценария тестирования и не будет в финальном приложении. - person PeterK; 10.02.2011

Вы присваиваете onGoingGame значение YES, а не сравниваете его с YES. Используйте == вместо =.

person Convolution    schedule 09.02.2011
comment
да, но он печатает NSLog, поэтому он должен запускать UIAlertView - person PeterK; 10.02.2011
comment
изменил это, но все еще та же проблема - person PeterK; 10.02.2011
comment
Ты знаешь, что даже если это задание, оно все равно будет правдой, верно? ДА определяется как 1. - person ; 10.02.2011

Вместо этого вы можете попробовать эту строку.

[[[[UIAlertView alloc] initWithTitle:@"this is my message" message:nil delegate:nil cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] autorelease] show];     

Кроме того, я считаю, что Apple не рекомендует использовать exit() в вашем приложении. Они всегда хотят, чтобы пользователь использовал кнопку «Домой» для выхода из приложения. Вызов exit() является жестким выходом, и это может быть причиной того, что вы не видите предупреждение.

person terloon    schedule 09.02.2011
comment
Просто для протокола: я использую exit(0) только на этапе тестирования этого конкретного кода, а не в приложении. - person PeterK; 10.02.2011

Вы не должны выпускать его сразу. И вы выходите из приложения еще до того, как представление предупреждений получает возможность отобразиться. :)

Ваш код будет продолжать работать, даже если окно оповещения отображается.


Фиксация

  1. Удалить выходной вызов
  2. Не выпускайте оповещение. Отпустите его в методе Dealloc его владельца.
  3. Сделайте представление предупреждения переменной экземпляра и добавьте к нему свойство сохранения.
  4. Инициализируйте представление предупреждений в его получателе, если оно еще недоступно.
  5. Установите его атрибуты в IBAction и покажите.
  6. Добавьте соответствующие методы делегата.

Если бы я не писал этот ответ на iPod touch, я бы опубликовал пример кода. Вы можете найти много такого кода с помощью Google.


Кроме того, если ваше приложение предназначено не только для английского языка, всегда следует использовать локализацию, предоставленную Foundation. В противном случае вы можете получить английский текст с сообщениями об ошибках по умолчанию и другими элементами пользовательского интерфейса.

person Community    schedule 09.02.2011
comment
Поменял, но результат тот же. - person PeterK; 10.02.2011
comment
@PeterK Я отредактировал свой ответ. Может быть, это поможет. Вы также можете прочитать документацию по UIAlertView. - person ; 10.02.2011
comment
Совершенно нормально выпустить представление предупреждений после вызова -show. Apple что-то делает с ним внутри, как только вы вызываете -show, поэтому его можно сразу же выпустить. Это не имеет отношения к его проблеме. - person CIFilter; 10.02.2011