我有一个网络管理员结构。我正在尝试在主UIViewController
中对其进行初始化,但是失败了。
struct NetworkManager {
static var enviroment: NetworkEnviroment = .production
static var apiKey = ""
private let mainApiRouter = Router<MainApi>()
func login(username: String, pass: String, completion:@escaping(_ product:User?, _ err: String?) ->()){
mainApiRouter.request(.login(username: username, password: pass)) { (data, resp, err) in
if err != nil {
completion(nil, "Please check your network connection")
} else {
if let reponse = resp as? HTTPURLResponse {
let result = handelNetworkResponse(reponse)
switch result {
case .success:
guard let responseData = data else {
completion(nil, NetworkResponse.noData.rawValue)
return
}
do {
let apiResponse = try JSONDecoder().decode(UserData.self, from: responseData)
if apiResponse.data != nil {
completion(apiResponse.data, nil)
} else {
completion(nil, "User login failed")
}
}catch(let error) {
completion(nil, "\(error.localizedDescription)")
}
case .failure(let failureError):
completion(nil, failureError)
}
}
}
}
}
}
这就是我在视图控制器中对其进行初始化的方式,因此我可以在网络管理器结构中使用登录功能。当我呼叫super.init
编码器时,网络管理员为零。
class LoginViewController: UIViewController {
var networkManager: NetworkManager!
init(networkManager: NetworkManager) {
super.init(nibName: nil, bundle: nil)
self.networkManager = networkManager
}
required init?(coder aDecoder: NSCoder) {
// super.init(coder: aDecoder)
fatalError("init(coder:) has not been implemented")
}
}
答案 0 :(得分:0)
您的问题是您试图从情节提要中加载此视图控制器,但尚未实现情节提要用于初始化在情节提要中创建的视图的init(coder:)
。如果删除fatalError并使用super.init(coder: aDecoder)
,则视图控制器将成功加载,但是将不会调用用于初始化网络管理器的代码,因为情节提要在加载视图控制器时不会调用该初始化程序-您将不得不将该代码移到其他地方。