解雇呈现的视图控制器

nik*_*ils 104 iphone cocoa-touch objective-c uiviewcontroller ios

我有一个理论问题.现在我正在阅读Apple的ViewController指南.

他们写:

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

但我无法解释,为什么我必须在呈现的VC中创建一个协议并添加委托变量,在呈现VC中创建委托方法以解除所呈现的VC,而不是在呈现的视图控制器方法中的简单调用

[self dismissViewControllerAnimated:NO completion:nil]

为什么第一选择更好?为什么Apple推荐它?

fou*_*dry 112

我认为苹果公司正在为这个潜在的大量API提供一些支持.

  [self dismissViewControllerAnimated:NO completion:nil]
Run Code Online (Sandbox Code Playgroud)

实际上有点小提琴.虽然您可以 - 合法地 - 在呈现的视图控制器上调用它,但它只是将消息转发到呈现视图控制器.如果你想做除了忽略VC之外的任何事情,你需要知道这一点,你需要像委托方法一样对待它 - 因为它几乎就是它,一个有点不灵活的烘焙委托方法.

也许他们遇到了大量不良代码,人们并不真正了解这是如何组合在一起的,因此他们要谨慎.

但是,当然,如果你需要做的就是解雇这个问题,那就继续吧.

我自己的方法是妥协,至少它提醒我发生了什么:

  [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]
Run Code Online (Sandbox Code Playgroud)

[迅速]

  self.presentingViewController?.dismiss(animated: false, completion:nil)
Run Code Online (Sandbox Code Playgroud)

  • 应该注意的是,使用`presentsViewController`几乎是无用的,因为如果将`self`嵌入其中,它将引用`UINavigationController`.在这种情况下,您根本无法获得`presentsViewController`.然而,`[self dismissViewControllerAnimated:completion]`仍然适用于那种情况.我的建议是继续使用它直到Apple修复它. (25认同)
  • 我喜欢这个答案在3年后仍然完全相关. (3认同)

Mic*_*uez 49

这适用于视图控制器的可重用性.

您的视图控制器不应该关心它是作为模态,推送到导航控制器还是其他任何东西.如果你的视图控制器自我解散,那么你假设它是以模态呈现的.您将无法将该视图控制器推送到导航控制器上.

通过实现协议,您可以让父视图控制器决定如何呈现/推送和解除/弹出它.


Sur*_*gch 45

针对Swift 3进行了更新

我来到这里只是想要解雇当前(呈现)的View Controller.我正在为有这个目的来到这里的人做出这个答案.

导航控制器

如果您使用的是导航控制器,那么它非常简单.

返回上一个视图控制器:

// Swift
self.navigationController?.popViewController(animated: true)

// Objective-C
[self.navigationController popViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

返回根视图控制器:

// Swift
self.navigationController?.popToRootViewController(animated: true)

// Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];
Run Code Online (Sandbox Code Playgroud)

(感谢Objective-C的这个答案.)

模态视图控制器

当以模态方式呈现视图控制器时,您可以通过调用将其从(从第二个视图控制器)中删除

// Swift
self.dismiss(animated: true, completion: nil)

// Objective-C
[self dismissViewControllerAnimated:YES completion:nil];
Run Code Online (Sandbox Code Playgroud)

文件说,

呈现视图控制器负责解除它所呈现的视图控制器.如果在呈现的视图控制器本身上调用此方法,UIKit会要求呈现视图控制器处理解雇.

所以它适用于呈现的视图控制器自己调用它.是一个完整的例子.

代表

OP的问题是关于使用委托解雇视图的复杂性.

到目前为止,我不需要使用委托,因为我通常有导航控制器或模态视图控制器,但如果我将来需要使用委托模式,我将添加更新.


jhi*_*t00 6

根据我的经验,当你需要从你想要的任何 ViewController中解除它并为每个取消它的viewcontroller执行不同的任务时它会派上用场.任何采用该协议的viewController都可以以自己的方式解除视图.(ipad vs iphone,或者在从不同视图中解散时传递不同的数据,在解雇时调用不同的方法等等.)

编辑:

因此,澄清一下,如果您想要做的就是关闭视图,我认为不需要设置委托协议.如果您从不同的呈现视图控制器中解除它需要执行不同的操作,那么这将是您使用该委托的最佳方式.


Osh*_*iya 6

试试这个:

[self dismissViewControllerAnimated:true completion:nil];
Run Code Online (Sandbox Code Playgroud)