我想在 ViewController 中接收与我的 Swift 应用程序中服务器响应时打开的相同回调。
我有两个视图控制器。第一个 ViewController 从类 "NetworkService" 注册回调。
第二个 ViewController 从第一个 ViewController 打开,第二个从变量中初始化的第一个 ViewController 接收"NetworkService",然后注册相同的 callBack。
当我尝试从服务器接收回调时,如果打开第一个视图控制器,我会得到响应。如果我打开第二个视图控制器并重新发送响应,我会在第二个视图控制器中正确获得此响应。
但是,如果我返回第一个视图控制器并得到响应,则它只会在第二个视图控制器上一直收到。
class NetworkService {
var onFunction: ((_ result: String)->())?
func doCall() {
self.onFunction?("result")
}
}
class MyViewController: UIViewController {
let networkService = NetworkService()
override func viewDidLoad() {
super.viewDidLoad()
networkService.onFunction = { result in
print("I got (result) from the server!")
}
}
}
我打开第二个视图控制器,如下所示:
let vc = self.storyboard!.instantiateViewController(withIdentifier: "second") as! SecondViewController
vc. networkService = networkService
self.navigationController?.pushViewController(vc, animated: true)
第二个视图控制器:
class SecondViewController: UIViewController {
var networkService: NetworkService?
override func viewDidLoad() {
super.viewDidLoad()
networkService!.onFunction = { result in
print("I got (result) from the server!")
}
}
}
如何再次在第一个视图控制器中接收响应,然后从调用popViewController的第二个视图控制器返回到第一个视图控制器?
self.navigationController?.popViewController(animated: false)
在两个视图控制器上调用 viewDidSeem 中的函数,以便每次在两个视图之间切换时都能得到响应怎么样?您无需在视图控制器之间传递networkService
。
override func viewDidAppear(_ animated: Bool) {
networkService!.onFunction = { result in
print("I got (result) from the server!")
}
}
可以使用通知,但在视图之间切换时必须注册和取消注册 VC。另一种选择是使用委托,您将需要共享网络服务实例。如何与协议一起使用的快速示例。
protocol NetworkServiceProtocol {
var service: NetworkService? { get }
func onFunction(_ result: String)
}
class NetworkService {
var delegate: NetworkServiceProtocol?
func doCall() {
self.delegate?.onFunction("results")
}
func update(delegate: NetworkServiceProtocol) {
self.delegate = delegate
}
}
class VC1: UIViewController, NetworkServiceProtocol {
var service: NetworkService?
init(service: NetworkService? = nil) {
self.service = service
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.service?.update(delegate: self)
}
func onFunction(_ result: String) {
print("On Function")
}
}