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

Call view controller function from delegate class

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

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 的示例的一部分。我的视图控制器 "header" 是:

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

我希望我提供了足够的信息,让任何人都能帮助我找出我做错了什么。我唯一需要做的就是调用该函数并将重定向 URL 传递给它。

我有点不明白你想做什么,为什么你试图将委托方法调用回 VC 而不是使用完成处理程序;但我认为您已经从头到尾获得了委托模式。我假设这个想法是:

  1. 视图控制器启动 URL 会话
  2. url 会话将 URL 会话的结果传递给 DelegateToHandle302 以处理
  3. DelegateToHandle302 然后尝试 运行 返回启动它的视图控制器中的方法。

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

所以在你的视图控制器中

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)
}