Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 取消显示的视图控制器_Iphone_Ios_Objective C_Cocoa Touch_Uiviewcontroller - Fatal编程技术网

Iphone 取消显示的视图控制器

Iphone 取消显示的视图控制器,iphone,ios,objective-c,cocoa-touch,uiviewcontroller,Iphone,Ios,Objective C,Cocoa Touch,Uiviewcontroller,我有一个理论问题。现在我正在阅读苹果的指南 他们写道: 当需要关闭显示的视图控制器时 首选方法是让显示视图控制器关闭 信息技术换句话说,只要可能,相同的视图控制器 视图控制器还应负责 驳回它。虽然有几种方法可以通知 显示视图控制器,其显示的视图控制器应 如果不考虑,首选的方法是委派 但我无法解释,为什么我必须在呈现的VC中创建一个协议并添加委托变量,在呈现的VC中创建委托方法以拒绝呈现的VC,而不是在呈现的视图控制器方法中进行简单调用 [自我解除视图控制器激活:无完成:无] 为什么第一选择更好?

我有一个理论问题。现在我正在阅读苹果的指南

他们写道:

当需要关闭显示的视图控制器时 首选方法是让显示视图控制器关闭 信息技术换句话说,只要可能,相同的视图控制器 视图控制器还应负责 驳回它。虽然有几种方法可以通知 显示视图控制器,其显示的视图控制器应 如果不考虑,首选的方法是委派

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

[自我解除视图控制器激活:无完成:无]


为什么第一选择更好?为什么苹果会推荐它?

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

编辑:


因此,为了澄清,如果您只想关闭视图,我认为没有必要设置委托协议。如果你需要做不同的事情,在你从不同的显示视图控制器中删除它之后,这将是你使用代理的最好方式。

我认为苹果在这里为一个潜在的笨拙的API掩盖了他们的秘密

  [self dismissViewControllerAnimated:NO completion:nil]
实际上有点麻烦。虽然您可以合法地在presenting view控制器上调用它,但它所做的只是将消息转发给presenting view控制器。如果你想做任何事情,而不仅仅是放弃VC,你需要知道这一点,你需要像对待委托方法一样对待它——因为这就是它的本质,一个有点僵硬的委托方法

也许他们遇到了很多糟糕的代码,因为人们并不真正理解这些代码是如何组合在一起的,因此他们很谨慎

但是,当然,如果你所需要做的就是放弃这件事,那就继续吧

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

  [[self presentingViewController] dismissViewControllerAnimated:NO completion:nil]
[快速]


这是为了视图控制器的可重用性

您的视图控制器不应该关心它是否以模态显示、是否被推到导航控制器上或其他任何形式。如果视图控制器自行关闭,则假定它是以模式显示的。您将无法将该视图控制器推送到导航控制器上


通过实现协议,您可以让父视图控制器决定如何显示/推送和取消/弹出它。

如果您使用的是模式使用视图取消

[self dismissViewControllerAnimated:NO completion:nil];
引用视图“视图控制器如何显示其他视图控制器”

显示的视图控制器链中的每个视图控制器都具有 指向链中围绕它的其他对象的指针。换句话说 换句话说,显示另一个视图的显示视图控制器 控制器在其presentingViewController和 presentedViewController属性。您可以使用这些关系来 根据需要跟踪视图控制器链例如,如果 如果用户取消当前操作,则可以删除中的所有对象 通过关闭第一个显示的视图控制器来创建链。 解除视图控制器不仅解除该视图控制器 还包括它提供的任何视图控制器。

因此,一方面,它有利于一个很好的平衡设计,良好的去耦合,等等。。。但另一方面,它非常实用,因为您可以快速返回到导航中的某个点


尽管如此,我个人宁愿使用展开的分段,也不愿尝试向后遍历呈现视图控制器树,这正是苹果在本章引用的内容

一点是,这是一种很好的编码方法。它满足许多面向对象的原则,如SRP、关注点分离等

因此,呈现视图的视图控制器应该是拒绝该视图的控制器


比如,一家房地产公司以出租的方式提供房子,应该有权收回它。

这是胡说八道。当需要委托时,委托是可以的,但如果它使代码更复杂——确实如此——那么就需要有理由这样做

我相信苹果有它的理由。但是,除非有真正的理由这样做,否则简单地让被介绍的风投来做就更清楚、更简洁了,而且到今天为止,这里还没有人介绍过我能看到的风投

协议在需要时非常优秀,但面向对象设计从来不是让模块之间进行不必要的通信

Tom Love(Objective C的共同开发人员)曾评论说,Objective C“优雅”、“小巧”、“简洁”且“定义良好”(与C++相比)。他说起来容易。委派是一个有用的功能,似乎“仅仅因为”而被过度使用,虽然我喜欢使用这种语言,但我害怕被迫使用不必要的语法使事情变得比必须的复杂。

为Swift 3更新

我来这里只是想关闭当前(显示的)视图控制器。我要为任何带着同样目的来到这里的人做出这个回答

导航控制器 如果您使用的是导航控制器,那么就很容易了

返回上一个视图控制器:

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

// Objective-C
[self.navigationController popViewControllerAnimated:YES];
// Swift
self.navigationController?.popToRootViewController(animated: true)

// Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];
返回根视图控制器:

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

// Objective-C
[self.navigationController popViewControllerAnimated:YES];
// Swift
self.navigationController?.popToRootViewController(animated: true)

// Objective-C
[self.navigationController popToRootViewControllerAnimated:YES];
(感谢您为目标C所做的努力。)

模式五
[self dismissViewControllerAnimated:true completion:nil];
self.navigationController?.popViewController(animated: true)
dismiss(animated: true, completion: nil)
let rootViewController:UIViewController = (UIApplication.shared.keyWindow?.rootViewController)!

        if (rootViewController.presentedViewController != nil) {
            rootViewController.dismiss(animated: true, completion: {
                //completion block.
            })
        }
        (viewController.navigationController?.presentingViewController
            ?? viewController.presentingViewController
            ?? viewController).dismiss(animated: true)