Сделать кнопку это UIAlertView выполнить Segue

Я создал UIAlertView за действие, которое дает мне 2 варианта. Я хочу, чтобы пользователь мог нажать на кнопку и заставить ее выполнить переход.

Вот код, который у меня есть:

- (IBAction)switchView:(id)sender
{
    UIAlertView *myAlert = [[UIAlertView alloc]
                            initWithTitle:@"Please Note"
                            message:@"Hello this is my message"
                            delegate:self
                            cancelButtonTitle:@"OK"
                            otherButtonTitles:@"Option 1", @"Option 2", nil];
    [myAlert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) {



    }
}

3 ответа

Да, поначалу это не очень очевидно, вам нужно создать ручной переход.

Выберите ViewController, который будет выполнять толкание (я тот, кто толкает), и подключите руководство к контроллеруpush-просмотра (контроллеру Pressed View).

iOS 8+ со Swift

Выберите вновь созданный segue и дайте ему имя (в моем случае это "segue.push.alert"(длинное имя для регистрации) и вызовите выполнение в действии предупреждения, например:

let alert = UIAlertController(title: "My Alert", message: "Be Alerted. This will trigger a segue.", preferredStyle: .Alert)
alert.addAction(UIAlertAction(title: "Cancel", style: .Cancel, handler: nil))
alert.addAction(UIAlertAction(title: "Segue", style: .Default, handler:
{
    [unowned self] (action) -> Void in

    self.performSegueWithIdentifier("segue.push.alert", sender: self)
}))

presentViewController(alert)

[unowned self] следует обращаться с осторожностью, если контроллер представления может освободить во время действия, вам лучше с [weak self] а затем делать self?.performSegue... если освобождение может произойти.

Старый ответ

Теперь из контроллера представления вы можете просто позвонить performSegueWithIdentifier:sender:, в твоем случае

// Using enums is entirely optional, it just keeps the code neat.
enum AlertButtonIndex : NSInteger
{
    AlertButtonAccept,
    AlertButtonCancel
};

// The callback method for an alertView
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)index
{
    if (index == AlertButtonAccept)
    {
        [self performSegueWithIdentifier:@"segue.push.alert" sender:self];
    }
}

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

Если вы дадите своему seue идентификатор в вашей раскадровке, вы можете сделать это:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) {

        [self performSegueWithIdentifier:@"foo" sender:nil];

    }
}

Вот еще один способ загрузить ViewController. Вы можете использовать Storyboard Identifier. Прочитайте это: Что такое идентификатор StoryBoard и как я могу его использовать?

Сначала установите Storyboard ID в Identity Inspector, а затем добавьте следующий код в ваш делегат оповещений.

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];

    if ([buttonTitle isEqualToString:@"Option 1"]) {

        // This will create a new ViewController and present it. 
        NewViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"NewViewControllerID"];

        [NewViewController setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
        [self presentViewController:NewViewController animated:YES completion:nil];

    }
}

Надеюсь это поможет!:)

Другие вопросы по тегам