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

StackOverflow https://stackoverflow.com/questions/1529632

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

[self dismissModalViewControllerAnimated:YES];

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

Другие советы

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

[self dismissViewControllerAnimated:YES completion:nil];

Быстрый

Обновлено для 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)
    }
}

Источник:

настоящееМодалвиевконтроллер:

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

увольнениеМодалвиевконтроллер:

[self dismissModalViewControllerAnimated:YES];

Быстрый

self.dismissViewControllerAnimated(true, completion: nil)

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

Просто создайте переход из 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%!

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top