Представление и отмена контроллера модального представления
-
20-09-2019 - |
Вопрос
Может ли кто-нибудь дать мне пример кода, который я могу использовать, чтобы сначала представить контроллер модального представления, а затем закрыть его?Это то, что я пытался:
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.
Раскадровка
Создайте два контроллера представления с кнопкой на каждом.Для второго контроллера представления установите имя класса на 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%!
Надеюсь, поможет!