从委托调用视图控制器函数 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 而不是使用完成处理程序;但我认为您已经从头到尾获得了委托模式。我假设这个想法是:
- 视图控制器启动 URL 会话
- url 会话将 URL 会话的结果传递给 DelegateToHandle302 以处理
- 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)
}
我对 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 而不是使用完成处理程序;但我认为您已经从头到尾获得了委托模式。我假设这个想法是:
- 视图控制器启动 URL 会话
- url 会话将 URL 会话的结果传递给 DelegateToHandle302 以处理
- 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)
}