【问题标题】:Present and dismiss modal view controller呈现和关闭模态视图控制器
【发布时间】:2010-12-04 12:25:31
【问题描述】:

谁能给我示例代码,我可以使用它首先呈现一个模态视图控制器,然后将其关闭?这是我一直在尝试的:

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”

【问题讨论】:

  • 正如下面有人所说,presentModalViewController:animated: 已被弃用。现在您需要使用presentModalViewController:animated:completion: 并在完成块中执行以下操作(如果您想等到red 出现)。无论如何,请阅读@MatterGoal 建议的文章:developer.apple.com/library/ios/#featuredarticles/…

标签: ios objective-c uiviewcontroller modal-view


【解决方案1】:

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

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

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

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

[self dismissModalViewControllerAnimated:YES];

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

【讨论】:

  • 根据 iPhone OS 的视图控制器编程指南,在关闭模式视图控制器时这是不正确的,您应该使用委托。所以在展示你的模态视图之前让你自己成为委托,然后从模态视图控制器调用委托来解除。
  • 请记住,自 io6 以来,这种呈现模式视图的方式已被贬低。使用:[self presentViewController:animated:completion:];而是
  • @OscarGomez 不,视图控制器编程指南没有说这种方法不正确。它确实说您建议的方法是“首选方法”。换句话说,虽然您的方法可能适用于许多情况,但设计并不是唯一的方法,而是您应该首先尝试的方法。 我建议您添加您引用的方法作为附加答案,因为此类问题有多个可行的答案,而您的答案可能对某些读者更好。
  • [self dismissModalViewControllerAnimated:YES]; 已弃用
  • redblue 上调用dismissModalViewControllerAnimated 有什么区别?从文档看来,我们应该在blue(呈现的VC)上调用它......
【解决方案2】:

斯威夫特

为 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)
    }
}

SecondViewController.swift

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

来源:

【讨论】:

    【解决方案3】:

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

    [self dismissViewControllerAnimated:YES completion:nil];
    

    【讨论】:

    • 请注意,这会自动将消息转发到 self.presentingViewController(根据 UIViewController 文档),因此为了清楚起见,最好调用 [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
    【解决方案4】:

    presentModalViewController:

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

    dismissModalViewController:

    [self dismissModalViewControllerAnimated:YES];
    

    【讨论】:

      【解决方案5】:

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

      只需从 TabBarController 的 FirstViewController(不是 Navigation Controller)创建一个 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% 有效!

      希望对你有帮助!

      【讨论】:

        【解决方案6】:

        斯威夫特

        self.dismissViewControllerAnimated(true, completion: nil)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多