从委托类调用视图控制器函数

时间:2019-11-23 00:50:26

标签: swift delegates

我相对较新,但是在尝试从已定义的委托中调用视图控制器中的函数时遇到问题。如何从此委托在视图控制器中调用该函数?这是一个混合项目,主要由Objective-C代码和一个Swift控制器组成。该函数在Swift控制器内部。下面是委托类:

class DelegateToHandle302:NSObject, URLSessionTaskDelegate {
func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {

    //convert to https
    let http = request.url!
    var comps = URLComponents(url: http, resolvingAgainstBaseURL: false)!
    comps.scheme = "https"
    let httpsUrl = comps.url!

    ViewControllerFunction(url: httpsUrl)

}

我收到错误消息,使用未解析的标识符'ViewControllerFunction'。我已经尝试创建视图控制器的实例,但是由于该视图控制器还具有音频播放器(它也无法正常工作),因此认为这不是正确的方法。

在这里,我从视图控制器内部的函数中调用委托:

    let urlString = "https://urlthatredirects.com"
    let config = URLSessionConfiguration.default
    let url = URL(string: urlString)

    //set delegate value equal to SessionDelegate to handle 302 redirect
    let delegate = DelegateToHandle302()

    //establish url session
    let session = URLSession(configuration: config, delegate: delegate, delegateQueue: nil)

    //set task with url
    let dataTask = session.dataTask(with: url!)

    //init call
    dataTask.resume()

我正在跟踪一个示例的一部分,该示例如何从重定向(https://gist.github.com/mgersty/b565ba4c9e9422637f15f52a5317f07e)中获取最终URL。我的视图控制器的“标题”是:

@objc class AudioPlayerController: UIViewController{........}

我希望我提供了足够的信息,以允许任何人协助我弄清楚我在做什么错。我唯一需要做的就是调用该函数并将重定向URL传递给它。

1 个答案:

答案 0 :(得分:2)

对于您要执行的操作以及为什么要尝试将委托方法回调回VC而不是使用完成处理程序,我有些困惑。但我认为您的委托模式是从前到后的。我假设这个想法是:

  1. 视图控制器启动URL会话
  2. URL会话将URLSession的结果传递给DelegateToHandle302进行处理
  3. DelegateToHandle302然后尝试在启动它的视图控制器中重新运行一个方法。

如果是这种情况,您实际上需要VC作为DelegateToHandle302类的委托,而不是相反。

因此在您的视图控制器中

let handlerFor302 = DelegateToHandle302()
handlerFor302.delegate = self. 

let session = URLSession(configuration: config, delegate: handlerFor302, delegateQueue: nil
   //etc... as before

创建供代理采用的协议,该协议定义了所需的功能

protocol URLProcessor {
   func  ViewControllerFunction(url: URL)
}

在您的视图控制器中采用协议并实现方法

extension MyViewController: URLProcessor {
   func  ViewControllerFunction(url: URL) { .... do whatever ...}

,然后将委托与DelegateToHandle302中的协议方法一起使用

class DelegateToHandle302:NSObject, URLSessionTaskDelegate {
   weak var delegate: URLProcessor? 

   func urlSession(_ session: URLSession, task: URLSessionTask, willPerformHTTPRedirection response: HTTPURLResponse, newRequest request: URLRequest, completionHandler: @escaping (URLRequest?) -> Void) {

    //Process the output

    delegate?.ViewControllerFunction(url: httpsUrl)
}