呈现和解除模态视图控制器

任何人都可以给我的示例代码,我可以用来首先提出一个模式的视图控制器,然后解雇它? 这是我一直在尝试的:

     NSLog(@“%@”,blue.modalViewController);
     [蓝色presentModalViewController:红色animation:是];
     NSLog(@“%@”,blue.modalViewController);
     [blue dismissModalViewControllerAnimated:YES];
     NSLog(@“%@”,blue.modalViewController);

这段代码在viewDidLoad中(“blue”和“red”都是UIViewController的子类)。 我希望我会显示红色的视图,然后立即隐藏它,用一些animation。 然而,这段代码只提供了模态视图,并没有消除它。 任何想法? 第一个日志显示“空”,而另外两个日志显示<RedViewController:0x3d21bf0>
另一点是,如果我把这个代码放在applicationDidFinishLaunching中:红色的视图根本不会出现,所有的日志都会变成“null”

首先,当你把代码放在applicationDidFinishLaunching中时,可能是从Interface Builder实例化的控制器还没有链接到你的应用程序(所以“红色”和“蓝色”仍然是nil )。

但是要回答你最初的问题,你做错了什么是你调用dismissModalViewControllerAnimated:在错误的控制器! 应该是这样的:

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

通常情况下,“红色”控制器应该决定在某个时候解散自己(也许当点击“取消”button时)。 然后“红色”控制器可以调用自己的方法:

 [self dismissModalViewControllerAnimated:YES]; 

如果它仍然不起作用,这可能与控制器是以animationforms呈现的事实有关,所以可能不允许在呈现控制器之后立即解散控制器。

我在xcode4.52中感到厌倦的最简单的方法是创build一个额外的视图,并通过使用segue模式(控制将button从视图1拖到第二个视图,selectModal)来连接它们。 然后将button拖到第二个视图或您创build的模态视图中。 控制并拖动此button到头文件并使用动作连接。 这将在您的controller.m文件中创build一个IBaction。 在代码中查找您的button操作types。

 [self dismissViewControllerAnimated:YES completion:nil]; 

presentModalViewController:

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

dismissModalViewController:

 [self dismissModalViewControllerAnimated:YES]; 

迅速

更新了Swift 3

在这里输入图像说明

故事板

创build两个视图控制器与每个button。 对于第二个视图控制器,请将类名称设置为SecondViewController ,将故事板ID设置为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) } } 

资源:

  • 文档
  • 那么回答

迅速

self.dismissViewControllerAnimated(true, completion: nil)

最简单的方法是使用Storyboard和Segue。

只需从您的TabBarController的FirstViewController(而不是导航控制器)创build一个Segue到一个LoginViewController并使用loginUI并将其命名为“showLogin”。

创build一个方法返回一个BOOL来validation用户login和/或他/她的会话是否有效…最好在AppDelegate上。 调用它isSessionValid。

在你的FirstViewController.m覆盖方法viewDidAppear,如下所示:

 - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; if([self isSessionValid]==NO){ [self performSegueWithIdentifier:@"showLogin" sender:self]; } } 

然后,如果用户login成功,只需closures或popupLoginViewController来显示您的标签。

工程100%!

希望能帮助到你!