【问题标题】:How to dismiss a viewcontroller within another ViewController?如何在另一个 ViewController 中关闭视图控制器?
【发布时间】:2015-11-10 12:31:33
【问题描述】:

假设我有名为 ABCDE 的视图控制器 我以 presentModel 的方式一个接一个地打开这些ViewConrollers。当我在 ViewController E 时,我想以 presentModel 方式打开另一个 ViewController F。在那个 F ViewController 我有一个后退按钮。当我点击它时,它应该关闭 F 并显示 A ViewController。但是现在当它关闭时显示 E。当我单击 F

的后退按钮时,如何关闭除 A 之外的所有其他视图控制器

请帮助我。谢谢

更新

-(IBAction)dismisthis:(id)sender{


UIViewController *dismissingViewController = self.presentingViewController;
while (dismissingViewController.presentingViewController != nil && [dismissingViewController isKindOfClass:[FrontViewController class]]) {
    dismissingViewController = self.presentingViewController;
}




[dismissingViewController dismissViewControllerAnimated:NO completion:NULL];

【问题讨论】:

    标签: ios objective-c uiviewcontroller presentmodalviewcontroller


    【解决方案1】:

    如果您关闭正在呈现另一个视图控制器的视图控制器,则整个层次结构将被关闭。有多少级别并不重要。所以你所要做的就是找到你的视图控制器A并告诉它关闭它呈现的视图控制器。

    如果A总是堆底,可以使用简单的循环来查找:

    UIViewController *dismissingViewController = self.presentingViewController;
    while (dismissingViewController.presentingViewController != nil) {
        dismissingViewController = self.presentingViewController;
    }
    
    [dismissingViewController dismissViewControllerAnimated:YES
                                                 completion:NULL];
    

    【讨论】:

    • 这行得通,我建议为您的视图控制器创建一个子类,这样即使稍后它包含在另一个视图控制器中,您也可以确保返回到您期望的那个。为此,您可以简单地更改上面的 while() 以检查“dismissingViewController.presentingViewController != nil && [dismissingViewController isKindOfClass:[MyAViewController class]]”。应用程序的未来迭代可能会从另一个控制器显示“A”,如果没有该检查,您可能会错误地关闭“A”。
    • 但是它说dismissViewController没有可见的界面
    • 这会将我重定向到 E 而不是 A
    • 使用调试器找出循环后dismissingViewController 的最终结果。
    • 您的第二个条件可能不正确。可能你想要[dismissingViewController isKindOfClass:[FrontViewController class]] == NO
    【解决方案2】:

    使用NSNotificationCenter 从 F 和 A 发送 Notification 会怎样?一旦 A 收到通知,它将调用 dismissViewController,我认为这将全部关闭。

    【讨论】:

    • 这是一个糟糕的解决方案。应尽可能使用通知来指示发生的事件,而不是触发特定操作。
    • 同意通知应该用于事件,但在这种情况下,通知是最快和最简单的解决方案,并减轻访问第一个视图控制器的头痛
    • “对于每个复杂的问题,都有一个清晰、简单且……错误的答案。” - H.L. Mencken :-)
    • 也同意,但我的解决方案没有错:)。至少如果他改变了流程中的任何内容,我的解决方案仍然有效。如果中间视图控制器之一嵌入在 UINavigationController 中,您的可能无法工作
    【解决方案3】:

    此时我能想到三个解决方案

    1. 您应该在 Appdelegate 的 stackObject(它是一个数组)中跟踪所有 viewController。当您希望它访问时,获取这些数组并关闭所有视图控制器对象。

    2. 您可以观察每个视图控制器,以观察将侦听通知的 NSNotification。当您在“F”中需要它时,只需发布​​通知,此通知将关闭 eviewcontrollers

    3. 转到 NavigationController 以便您可以推送到 rootviewcontroller

    【讨论】:

      【解决方案4】:

      试试这个:

      UIViewController *rootVC = [UIApplication sharedApplication].delegate.window.rootViewController;
      [rootVC dismissViewControllerAnimated:YES completion:nil];
      
      // One-liner
      // [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:YES completion:nil];
      

      【讨论】:

        【解决方案5】:

        将 A 设为 rootViewController 并在“F”的后退按钮上使用以下代码:

        [[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissViewControllerAnimated:true completion:nil];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-03
          • 1970-01-01
          • 2016-11-20
          • 2014-12-12
          • 1970-01-01
          • 2014-05-07
          相关资源
          最近更新 更多