从 swift 类返回上一个控制器

Posted

技术标签:

【中文标题】从 swift 类返回上一个控制器【英文标题】:Go back to previous controller from class swift 【发布时间】:2015-09-03 15:40:18 【问题描述】:

我有一个使用 http 调用从外部存储流式传输视频的应用程序。 当用户的设备没有连接到网络服务时,我需要应用返回到之前的控制器。

流程如下:用户访问元素列表(表格视图单元格),选择一个,然后应用程序转到播放器控制器。在此控制器上,调用流式传输文件。

我在控制器外部的一个类中使用了一个 api 调用处理程序,但我不知道如何继续让它从这里(元素列表)返回到前一个控制器。

连接问题错误都在 api 类中捕获。 我没有显示任何代码,因为我不确定它是否相关。如果您需要查看任何内容,请告诉我,我会更新问题。应该怎么做? (当然我用的是导航控制器)

谢谢

【问题讨论】:

【参考方案1】:

如果你想回到之前的视图控制器,你应该使用:

navigationController?.popViewControllerAnimated(true)

如果你需要在视图控制器中而不是在另一个类中使用这个函数,你可以使用 NSNotificationCenter 来通知视图控制器,当它需要显示前一个控制器时,就像这样:

YourViewController

override func viewDidLoad() 

    ...

    NSNotificationCenter.defaultCenter().addObserver(
        self,
        selector: "goBack:",
        name: "goBackNotification",
        object: nil)

    ...


func goBack(notification: NSNotification)

    navigationController?.popViewControllerAnimated(true)

另一个类

NSNotificationCenter.defaultCenter().postNotificationName("goBackNotification", object: nil)

不要忘记删除 YourViewController 中的观察者:

deinit 

    NSNotificationCenter.defaultCenter().removeObserver(self)

编辑 1: 您显然可以使用 delegate 而不是 NSNotification 方法。如果您不知道 NSNotification 和委托之间的区别,我向您推荐 this answer。

【讨论】:

工作得很好,当涉及到控制器和类之间的通信时,通知似乎是处理所有事情的方法。谢谢! 你真的应该为此使用委托。【参考方案2】:

除了 NSNotificationCenter 之外,一种常见的方法是利用闭包或委托来通知您的 ViewController 流式传输尝试失败。使用闭包,负责流式传输的类的 API 可以扩展为将完成闭包作为参数,如果发生则使用 NSError 调用它,如果没有发生则使用 nil。

func streamFile(completion: NSError? -> Void) 
    // Try to start the streaming and call the closure with an error or nil
    completion(errorOrNil)

当调用 ViewController 中的 API 时,您可以将闭包传递给该方法并检查错误。如果出现问题,应该会出现错误,并且应该关闭 ViewController

func startStream() 
    StreamingAPIClient.streamFile(completion:  [weak self] error in
        if error != nil 
            // Handle error
            self.dismissViewControllerAnimated(true, completion: nil)
         else 
            // Proceed with the streaming
        
    )

【讨论】:

以上是关于从 swift 类返回上一个控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UICollectiveViewCell 类呈现视图控制器 - SWIFT

返回上一个 ViewController 不适用于 Swift 中的多个视图控制器

Swift 3返回上一个视图控制器

无法从 swift 控制器代码访问 Objective C 类

Swift - 从模型中的 API 调用返回 JSON 对象作为字典以在视图控制器中使用

停止导航控制器swift的导航