Представление и отклонение модального контроллера представления - PullRequest
70 голосов
/ 07 октября 2009

Может ли кто-нибудь дать мне пример кода, который я могу использовать, чтобы сначала представить контроллер модального представления, а затем отклонить его? Вот что я пытался:

    NSLog(@"%@", blue.modalViewController);
    [blue presentModalViewController:red animated:YES];
    NSLog(@"%@", blue.modalViewController);
    [blue dismissModalViewControllerAnimated:YES];
    NSLog(@"%@", blue.modalViewController);
Этот код находится в viewDidLoad («синий» и «красный» являются подклассами UIViewController). Я ожидаю, что я покажу красный вид, а затем сразу же скрою его с некоторой анимацией. Однако этот фрагмент кода представляет только модальное представление и не отклоняет его. Любая идея? Первый журнал показывает «ноль», в то время как два других журнала показывают
Другой момент, если я добавлю этот код в applicationDidFinishLaunching: красный вид вообще не появится, и все журналы получат «ноль»

Ответы [ 6 ]

106 голосов
/ 07 октября 2009

Прежде всего, когда вы помещаете этот код в applicationDidFinishLaunching, может случиться так, что контроллеры, созданные из Interface Builder, еще не связаны с вашим приложением (поэтому «красный» и «синий» по-прежнему nil).

Но, чтобы ответить на ваш первоначальный вопрос, вы неправильно делаете, что звоните dismissModalViewControllerAnimated: не на тот контроллер! Должно быть так:

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

Обычно «красный» контроллер должен решить отменить себя в какой-то момент (возможно, когда нажата кнопка «отмена»). Тогда «красный» контроллер может вызвать метод на self:

[self dismissModalViewControllerAnimated:YES];

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

13 голосов
/ 17 мая 2016

Swift

Обновлено для Swift 3

enter image description here

Раскадровка

Создание двух контроллеров представления с кнопкой на каждом. Для второго контроллера представления установите имя класса на SecondViewController и идентификатор раскадровки на secondVC.

код

ViewController.swift

import UIKit
class ViewController: UIViewController {

    @IBAction func presentButtonTapped(_ sender: UIButton) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
        myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
        self.present(myModalViewController, animated: true, completion: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

    @IBAction func dismissButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

Источник:

13 голосов
/ 18 января 2013

Самый простой способ, которым я устал в xcode 4.52, - это создать дополнительный вид и соединить их с помощью модального сегмента (управляйте перетаскиванием кнопки с первого на второй вид, выбрав Модальный). Затем перетащите кнопку на второй или модальный вид, который вы создали. Контролируйте и перетащите эту кнопку в заголовочный файл и используйте действие connection. Это создаст IBaction в вашем файле controller.m. Найдите тип действия кнопки в коде.

[self dismissViewControllerAnimated:YES completion:nil];
9 голосов
/ 05 сентября 2012

presentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];
3 голосов
/ 08 сентября 2015

Swift

self.dismissViewControllerAnimated(true, completion: nil)

2 голосов
/ 29 ноября 2012

Самый простой способ сделать это - использовать раскадровку и Segue.

Просто создайте Segue из FirstViewController (а не контроллера навигации) вашего TabBarController в LoginViewController с пользовательским интерфейсом входа и назовите его «showLogin».

Создать метод, который возвращает BOOL для проверки, если пользователь вошел в систему и / или его / ее сеанс действителен ... предпочтительно в AppDelegate. Назовите его isSessionValid.

На вашем FirstViewController.m переопределите метод viewDidAppear следующим образом:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if([self isSessionValid]==NO){
        [self performSegueWithIdentifier:@"showLogin" sender:self];
    }
}

Затем, если пользователь успешно вошел в систему, просто отклоните или откройте LoginViewController, чтобы отобразить ваши вкладки.

Работает на 100%!

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

...