Подавать и отклонять контроллер модального просмотра

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

    NSLog(@"%@", blue.modalViewController);
    [blue presentModalViewController:red animated:YES];
    NSLog(@"%@", blue.modalViewController);
    [blue dismissModalViewControllerAnimated:YES];
    NSLog(@"%@", blue.modalViewController);
Этот код в viewDidLoad ( "синий" и "красный" - оба подкласса UIViewController). Я ожидаю, что я покажу красное представление, а затем сразу скрою его, с некоторой анимацией. Однако этот фрагмент кода представляет только модальный вид и не отклоняет его. Есть идеи? Первый журнал показывает "null", в то время как два других журнала показывают < RedViewController: 0x3d21bf0 >

Другое дело, если я поместил этот код в applicationDidFinishLaunching: красное представление вообще не появляется, и все журналы получают "null"

Ответ 1

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

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

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

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

[self dismissModalViewControllerAnimated:YES];

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

Ответ 2

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

[self dismissViewControllerAnimated:YES completion:nil];

Ответ 3

presentModalViewController:

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

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];

Ответ 4

Swift

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

введите описание изображения здесь

Раскадровка

Создайте два контроллера просмотра с помощью кнопки на каждом. Для второго контроллера представления задайте имя класса 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)
    }
}

Источник:

Ответ 5

Свифта

self.dismissViewControllerAnimated(true, completion: nil)

Ответ 6

Самый простой способ сделать это - использовать Storyboard и 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%!

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