我相对较新,但是在尝试从已定义的委托中调用视图控制器中的函数时遇到问题。如何从此委托在视图控制器中调用该函数?这是一个混合项目,主要由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传递给它。
答案 0 :(得分:2)
对于您要执行的操作以及为什么要尝试将委托方法回调回VC而不是使用完成处理程序,我有些困惑。但我认为您的委托模式是从前到后的。我假设这个想法是:
如果是这种情况,您实际上需要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)
}