来自完成处理程序的 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 cvv 开头,而不是VD0000VCv .一般来说,名称应该有意义,而不是编号 - 不是 VD0000O0001S0000V0005 - 我 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 完成处理程序的返回值?

在 Swift 的表格视图中按字母部分显示来自 JSON 的数据

Swift 3.0:使用 URLSessionDownloadDelegate 完成下载后如何在不同的视图控制器中打开 PDF

使用 AVPLayer 实现媒体播放器以在 Swift 4 的模态视图控制器的弹出视图中播放来自远程 url 的音频

显示来自不同控制器的视图[重复]

swift 4中的完成处理程序