【问题标题】:Why is delegate/protocol Apple's preferred approach to dismiss presented UIViewControllers?为什么委托/协议 Apple 首选的方法是关闭呈现的 UIViewControllers?
【发布时间】:2012-07-21 05:20:21
【问题描述】:

当 UIViewController 呈现另一个视图控制器时,在 iOS 5 下,呈现的视图控制器关闭自身的最简单方法是调用:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:NULL];

另一方面,Apple 的 View Controller Programming Guide 说:

当需要关闭呈现的视图控制器时,首选方法是让呈现的视图控制器关闭它。换句话说,只要有可能,呈现视图控制器的同一个视图控制器也应该负责解除它。 虽然有几种技术可以通知呈现视图控制器其呈现的视图控制器应该被解除,但首选技术是委托。

这导致这里的一些答案建议坚持制定新的协议和委托,即使只呈现一个非常简单的视图控制器。为什么这是文档的“首选技术”而不是上面的单行?使用委托/协议技术编写的代码大量增加的缺点是否有任何抵消优势?显然,如果来自呈现的视图控制器的信息需要传递回呈现的视图控制器委托是一种很好的技术。但是,信息是委托的原因,而不是简单地从屏幕上删除呈现的视图控制器。

【问题讨论】:

    标签: ios cocoa-touch uiviewcontroller


    【解决方案1】:

    [self dismissViewControllerAnimated:YES completion:nil](在 iOS 5 [self dismissModalViewControllerAnimated:YES] 之前)可以实现相同的行为,因为一次最多只能呈现一个视图控制器(模态)。

    然而,委托模式的重点是单个视图控制器可以以不同的方式呈现,例如模态或推送到导航堆栈。该视图控制器不知道它是如何呈现的(好吧,它可以弄清楚,但它不应该关心)。它唯一应该做的就是通知它的父母,即委托人,它的工作已经完成。然后委托决定如何移除视图控制器(关闭模式或从导航堆栈中弹出等),或者孩子应该留下,因为它的工作结果不足。所以主要思想是视图控制器的可重用性。

    【讨论】:

      【解决方案2】:

      [[self presentingViewController]dismissViewControllerAnimated:YES 完成:NULL];

      这可能是最简单的,但通常不是很有用。

      模态视图通常需要向调用者返回一些信息;这就是为什么它们是模态的。在更传统的 SDK 中,模式窗口会阻止调用者,直到模式窗口被关闭。然后将模态窗口的结果返回给调用者。例如:

      int result = ShowModalDialog("Do you want to continue?");
      if (result == kYes) 
      {
          doSomething();
      }
      else
      {
          return;
      }
      

      在 UIKit 中,-presentModalViewController: 不会阻塞,因此您需要一些其他机制让模态视图控制器向呈现视图控制器返回信息。通常这是通过委托完成的,尽管还有其他方法(例如让呈现控制器处理左右 UINavigationBar 按钮)。

      如果模态视图控制器需要向其呈现视图控制器返回一个值,那么这是通过委托完成的,在这种情况下,呈现控制器在收到结果后关闭模态控制器是有意义的。这是原始模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 2018-01-13
        • 1970-01-01
        相关资源
        最近更新 更多