来自完成处理程序的 Swift 显示视图控制器
Posted
技术标签:
【中文标题】来自完成处理程序的 Swift 显示视图控制器【英文标题】:Swift show view controller from a completion handler 【发布时间】:2016-01-17 17:29:07 【问题描述】:我有一个视图控制器,其中包含构造视图内容的函数“CV”。函数 CV 有一个完成处理程序,它返回它自己作为变量 V。我现在想要做的是当我创建该视图的新实例时,它显示 V 如下:
func S0000 (VD0000: O0001)
(self.storyboard!.instantiateViewControllerWithIdentifier("V0005") as! V0005).Cv (VD0000) (V) -> Void in
NSOperationQueue.mainQueue().addOperationWithBlock
self.presentViewController(V, animated: true, completion: nil)
这会返回 V == nil 的错误,我不明白为什么。我发现如果我这样写:
func S0000 (VD0000: O0001)
let V = self.storyboard!.instantiateViewControllerWithIdentifier("V0005") as! V0005
self.showViewController(V, sender: self)
V.Cv (VD0000) (V) -> Void in
NSOperationQueue.mainQueue().addOperationWithBlock
比它起作用,但这违背了在其构造完成时仅呈现 V 的目的。
我该怎么做?
【问题讨论】:
我不知道从哪里开始:变量和函数应该以小写字母vd0000
、cv
和v
开头,而不是VD0000
、V
和Cv
.一般来说,名称应该有意义,而不是编号 - 不是 VD0000
、O0001
、S0000
、V0005
- 我 10000% 向您保证,除了您之外,没有人能理解您的代码。
是的,我知道,我自以为是,所以我一开始就错了,无法真正摆脱它,但我想尝试。
重写一切。你将无法处理这种混乱。
【参考方案1】:
在第一个函数中,视图控制器的实例在函数完成后立即超出范围,因此在调用完成处理程序时它不再存在。
[编辑]
你可以有一个名为 preraringViewController:UIViewController 的变量吗?在包含 S000 的类中,并在 .cv 准备它时使用它来保持对视图控制器的引用。
var preraringViewController:UIViewController? = nil
func S0000 (VD0000: O0001)
preraringViewController = self.storyboard!.instantiateViewControllerWithIdentifier("V0005")
(preraringViewController as! V0005).Cv (VD0000)
(V) -> Void in
NSOperationQueue.mainQueue().addOperationWithBlock
self.presentViewController(V, animated: true, completion: nil)
preraringViewController = nil
【讨论】:
我怎样才能防止这种情况发生? 您必须将实例变量保留在比 S000 函数更宽的范围内。我编辑了我的答案以举个例子。以上是关于来自完成处理程序的 Swift 显示视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 的表格视图中按字母部分显示来自 JSON 的数据
Swift 3.0:使用 URLSessionDownloadDelegate 完成下载后如何在不同的视图控制器中打开 PDF