Показать UIAlertView после нажатия кнопки UIActionSheet

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

Код выглядит следующим образом:

.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>

@interface mapView : UIViewController <MKMapViewDelegate, UIActionSheetDelegate, UIAlertViewDelegate>

@property (nonatomic, weak)IBOutlet MKMapView *mapView;
@property (nonatomic, weak)IBOutlet UIBarButtonItem *getDirections;

- (IBAction)selectDestination:(id)sender;
- (void)checkLeave;

@end

.m

- (IBAction)selectDestination:(id)sender
{
    UIActionSheet *selectDestinationAS = [[UIActionSheet alloc] initWithTitle:@"Select Destination: " delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Destination 1", @"Destination 2", nil];
    [selectDestinationAS showInView:self.view];
}

- (void)checkLeave
{
    UIAlertView *checkLeaveAlert = [[UIAlertView alloc] initWithTitle:@"Leave CDSI?" message:@"This will open the Maps application to continue directions. Are you sure you want to continue?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Open", nil];
    [checkLeaveAlert show];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [self checkLeave];

    if ([[actionSheet buttonTitleAtIndex:buttonIndex]  isEqualToString: @"Destination 1"]) {
        NSURL *BOHMDirections = [NSURL URLWithString:@"http://maps.apple.com/?daddr=Destination1&saddr=Current+Location"];
        [[UIApplication sharedApplication] openURL:BOHMDirections];
    } else if ([[actionSheet buttonTitleAtIndex:buttonIndex]  isEqualToString: @"Destination 2"]) {
        NSURL *BOPDirections = [NSURL URLWithString:@"http://maps.apple.com/?daddr=Destination2&saddr=Current+Location"];
        [[UIApplication sharedApplication] openURL:BOPDirections];
    }
}

Отображается ActionSheet, когда выбран параметр, открывается приложение «Карты» (по желанию), но AlertView появляется только после повторного входа в исходное приложение. Как мне сделать так, чтобы он отображался перед выходом из приложения?


person slichlyter12    schedule 25.03.2014    source источник
comment
Где находится метод делегата UIAlertView? Вы не обрабатываете ответ из представления предупреждений — если представление было показано до закрытия приложения — нажатие кнопки «Отмена» ничего не сделает.   -  person Robert J. Clegg    schedule 26.03.2014


Ответы (2)


Перейдите к внешнему приложению на делегате UIAlertView.

Чтобы передать индекс выбранного элемента в UIActionSheet, передайте индекс как параметр в методе checkLeave и установите его как тег в UIAlertView.

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

Если вам нужно, вы можете добавить частное свойство, чтобы удерживать данные элемента, на которые нажали, и получить к ним доступ в UIAlertViewDelegate.

- (void)checkLeave :(NSInteger)index
{
    UIAlertView *checkLeaveAlert = [[UIAlertView alloc] initWithTitle:@"Leave CDSI?" message:@"This will open the Maps application to continue directions. Are you sure you want to continue?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Open", nil];
    [checkLeaveAlert setTag:index];
    [checkLeaveAlert show];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    [self checkLeave : buttonIndex];

}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
   if(alertView.tag == 1){
       //Destination 1 clicked
  }
}
person ksivamuthu    schedule 25.03.2014
comment
Спасибо! Это сработало все, кроме 'alertView.tag == 1', что фактически соответствовало моему второму пункту назначения. - person slichlyter12; 26.03.2014

Подобно листу действий, UIAlertView имеет протокол делегата, который вы должны внедрить/соблюдать. Особенно метод alertView:didDismissWithButtonIndex: представляет интерес.

Вызывайте приложение «Карты» там, а не в clickedButtonAtIndex

person Hermann Klecker    schedule 25.03.2014