Controlador de Visualização Modal Apresentante e Disponível
-
20-09-2019 - |
Pergunta
Alguém pode me dar o código de exemplo que eu posso usar para primeiro apresentar um controlador de visualização modal e depois descartá -lo? É isso que tenho tentado:
NSLog(@"%@", blue.modalViewController); [blue presentModalViewController:red animated:YES]; NSLog(@"%@", blue.modalViewController); [blue dismissModalViewControllerAnimated:YES]; NSLog(@"%@", blue.modalViewController);Este código está no ViewDidload ("Blue" e "Red" são subclasses do UIViewController). Espero mostrar a vista vermelha e depois escondê -la imediatamente, com alguma animação. No entanto, esse código de código apresenta apenas a visão modal e não a descarta. Qualquer ideia? O primeiro log mostra "null", enquanto os outros dois logs mostramu003CRedViewController: 0x3d21bf0>
Outro ponto é que, se eu colocar este código no ApplicationDidfinishlaunching: a View Red não aparece, e todos os logs ficam "nulos"
Solução
Primeiro de tudo, quando você coloca esse código no ApplicationDidFinishLaunching, pode ser o caso de os controladores instanciados do Builder de Interface ainda não estão vinculados ao seu aplicativo (para que "Red" e "Blue" ainda sejam nil
).
Mas para responder à sua pergunta inicial, o que você está fazendo de errado é que você está ligando dismissModalViewControllerAnimated:
No controlador errado! Deve ser assim:
[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];
Normalmente, o controlador "vermelho" deve decidir se descartar em algum momento (talvez quando um botão "cancelar" é clicado). Então o controlador "vermelho" poderia chamar o método self
:
[self dismissModalViewControllerAnimated:YES];
Se ainda não funcionar, pode ter algo a ver com o fato de que o controlador é apresentado de maneira animada, para que você não tenha permissão para descartar o controlador logo após apresentá -lo.
Outras dicas
A maneira mais fácil de cansar do Xcode 4.52 foi criar uma visualização adicional e conectá -las usando o Modal Segue (Controle arraste o botão da visualização um para a segunda exibição, escolhido modal). Em seguida, arraste um botão para a segunda visualização ou a visualização modal que você criou. Controle e arraste este botão para o arquivo de cabeçalho e use a conexão de ação. Isso criará uma ibação no seu arquivo controlador.m. Encontre o seu tipo de ação do botão no código.
[self dismissViewControllerAnimated:YES completion:nil];
Rápido
Atualizado para Swift 3
Storyboard
Crie dois controladores de exibição com um botão em cada um. Para o segundo controlador de exibição, defina o nome da classe SecondViewController
e o storyboard ID para secondVC
.
Código
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)
}
}
Fonte:
PresentModalViewController:
MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];
DispensMmodalViewController:
[self dismissModalViewControllerAnimated:YES];
Rápido
self.dismissViewControllerAnimated(true, completion: nil)
A maneira mais fácil de fazer isso é usar o storyboard e um segue.
Basta criar um segue do FirstViewController (não o controlador de navegação) do seu TabBarController para um LoginViewController com a interface do usuário de login e nomeie -o "ShowLogin".
Crie um método que retorne um BOOL para validar se o usuário conectado e/ou sua sessão for válida ... de preferência no appDelegate. Chame isso de ISSessionValid.
No seu FirstViewController.m Substitua o método ViewDidAppear da seguinte maneira:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
if([self isSessionValid]==NO){
[self performSegueWithIdentifier:@"showLogin" sender:self];
}
}
Então, se o usuário efetuou login com sucesso, basta descartar ou exibir o LoginViewController para mostrar suas guias.
Funciona 100%!
Espero que ajude!