为什么委托/协议Apple首选方法解雇UIViewControllers?

时间:2012-07-22 22:52:58

标签: ios cocoa-touch uiviewcontroller

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

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

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

  

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

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

2 个答案:

答案 0 :(得分:3)

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

然而,委托模式的要点是单个视图控制器可以以不同的方式呈现,例如模态或通过推送到导航堆栈。那个视图控制器不知道它是如何呈现的(好吧,它可以解决它,但它不应该关心)。它应该做的唯一事情是通知它的父母,即代表,它的工作已经完成。然后委托决定如何删除视图控制器(从导航堆栈中删除模态或弹出等)或者由于其工作结果不足而应该保留该子项。所以主要的想法是视图控制器的可重用性。

答案 1 :(得分:1)

  

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

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

模态视图通常需要将一些信息返回给调用者;这就是为什么他们是模态的。在更传统的SDK中,模态窗口会阻止其调用者,直到模态窗口被解除。然后将模态窗口的结果返回给调用者。 E.g:

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

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

如果模态视图控制器需要将值返回到其呈现视图控制器,则通过委托完成,并且在这种情况下,呈现控制器在接收到结果后关闭模态控制器是有意义的。这是最初的模式。