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

phu*_*ehe 70 objective-c uiviewcontroller modal-view ios

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

    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"

Tom*_*ren 107

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

但是要回答你最初的问题,你所犯的错误就是你正在呼唤dismissModalViewControllerAnimated:错误的控制器!它应该是这样的:

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

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

[self dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

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

  • 根据适用于iPhone OS的View Controller Programming指南,当解除您应该使用委托的模态视图控制器时,这是不正确的.因此,在呈现模态视图之前,请将自己作为委托,然后从模态视图控制器中调用委托来解除. (57认同)
  • @OscarGomez不,视图控制器编程指南**不会说这种方法不正确.它确实说你建议的方法是"首选方法".换句话说,虽然您的方法可能适用于许多情况,但它不是唯一的方法,而是您应该首先尝试的方法._我建议你添加你引用的方法作为一个额外的答案,因为对这样的问题有多个可行的答案,而你的某些读者可能会更好._ (5认同)
  • `[self dismissModalViewControllerAnimated:YES];`不推荐使用 (4认同)

max*_*max 13

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

[self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)


Sur*_*gch 13

迅速

针对Swift 3进行了更新

在此输入图像描述

故事板

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

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

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

资源:


小智 9

presentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)