Подавать и отклонять контроллер модального просмотра
Может ли кто-нибудь дать мне пример кода, который я могу использовать, чтобы сначала представить 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%!
Надеюсь, что это поможет!