0

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

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

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

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

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

4

2 回答 2

3

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

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

于 2012-07-22T23:23:40.237 回答
1

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

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

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

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

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

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

于 2012-07-22T23:16:38.390 回答