模态视图控制器的存在和消失

谁能给我一个示例代码,我可以用来首先显示一个模态视图控制器,然后放弃它?这就是我一直在尝试的:

NSLog(@"%@", blue.modalViewController);
[blue presentModalViewController:red animated:YES];
NSLog(@"%@", blue.modalViewController);
[blue dismissModalViewControllerAnimated:YES];
NSLog(@"%@", blue.modalViewController);

这段代码在 viewDidLoad 中(“ blue”和“ red”都是 UIViewController 的子类)。我希望我将显示红色视图,然后立即隐藏它,一些动画。然而,这段代码只显示了模态视图,并没有忽略它。知道吗?第一个日志显示“ null”,而另外两个日志显示 <RedViewController: 0x3d21bf0>

另一点是,如果我将这段代码放在 applicationDidFinishLaunching 中: 红色视图根本不会出现,所有日志都会得到“ null”

211713 次浏览

首先,当你把这段代码放到 applicationDidFinishLaunching 中时,可能会出现这样的情况: 从 Interface Builder 实例化的控制器还没有链接到你的应用程序(所以“ red”和“ blue”仍然是 nil)。

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

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

通常,“红色”控制器应该决定在某个时刻(可能是单击“取消”按钮时)关闭自己。然后“红色”控制器可以调用 self上的方法:

[self dismissModalViewControllerAnimated:YES];

如果它仍然不工作,可能与控制器以动画方式呈现的事实有关,因此您可能不被允许在呈现控制器之后这么快就关闭它。

目录 ModalViewController:

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

解雇 ModalViewController:

[self dismissModalViewControllerAnimated:YES];

最简单的方法是使用故事板和接续。

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

创建一个方法,返回一个 BOOL 来验证用户登录和/或他/她的会话是否有效... ... 最好是在应用委托上。称之为 isSessionValid。

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

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];


if([self isSessionValid]==NO){
[self performSegueWithIdentifier:@"showLogin" sender:self];
}
}

然后,如果用户成功登录,只需关闭或弹出 LoginViewController 来显示您的选项卡。

百分百有效!

希望能有帮助!

在 xcode 4.52中,最简单的方法是创建一个额外的视图,并使用 segue mode (控件将按钮从视图1拖动到第二个视图,选择 Modal)来连接它们。 然后将按钮拖动到第二个视图或您创建的模态视图。控件并将此按钮拖动到头文件,然后使用操作连接。这将在 Controler.m 文件中创建一个 IBaction。在代码中查找按钮操作类型。

[self dismissViewControllerAnimated:YES completion:nil];

斯威夫特

self.dismissViewControllerAnimated(true, completion: nil)

斯威夫特

更新为 Swift 3

enter image description here

故事板

创建两个视图控制器,每个视图控制器上有一个按钮。对于第二个视图控制器,将类名称设置为 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)
}
}

Second ViewController Swift

import UIKit
class SecondViewController: UIViewController {
    

@IBAction func dismissButtonTapped(_ sender: UIButton) {
self.dismiss(animated: true, completion: nil)
}
}

来源: