显示和关闭模态视图控制器

时间:2009-10-07 05:23:13

标签: ios objective-c uiviewcontroller modal-view

任何人都可以给我一些示例代码,我可以使用它来首先呈现一个模态视图控制器,然后解雇它吗?这就是我一直在尝试的:

    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”

6 个答案:

答案 0 :(得分:106)

首先,当您将该代码放在applicationDidFinishLaunching中时,可能是从Interface Builder实例化的控制器尚未链接到您的应用程序(因此“红色”和“蓝色”仍为nil

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

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

通常情况下,“红色”控制器应该决定在某个时候解雇自己(可能是在点击“取消”按钮时)。然后“红色”控制器可以在self上调用该方法:

[self dismissModalViewControllerAnimated:YES];

如果它仍然不起作用,则可能与控制器以动画方式呈现的事实有关,因此在呈现控制器之后可能不会很快解除控制器。

答案 1 :(得分:13)

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

[self dismissViewControllerAnimated:YES completion:nil];

答案 2 :(得分:13)

夫特

更新了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)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

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

来源:

答案 3 :(得分:9)

presentModalViewController:

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

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];

答案 4 :(得分:3)

夫特

self.dismissViewControllerAnimated(true, completion: nil)

答案 5 :(得分:2)

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

只需从TabBarController的FirstViewController(而不是导航控制器)创建一个Segue到具有登录UI的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%工作!

希望它有所帮助!