问题描述
嗨,我想将viewDidAppear放在我的扩展程序中,但是无法触发...
查看代码:
extension MyAutoWelcomViewController: VehiclemangerDelegate {
func didUpdateRdwInfo(rdwData: RdwModel) {
}
func didUpdateVehicleInfo(vehicle: VehicleModel) {
dispatchQueue.main.async {
// code to pass data to a label
print(vehicle.numberOfVehicles)
let numberOfVehilce = vehicle.numberOfVehicles
self.TestLabel.text = String(numberOfVehilce)
func viewDidAppear(_ animated: Bool) {
self.vehicleManager.delegate = self
// check if vehicle list is nil
self.vehicleManager.getVehicleData() // call api to get the user vehicle list
if numberOfVehilce == 0 {
// show the welcome screen
print("vehicleList is nil")
} else {
// use segue to navigate to the auto list screen
self.performSegue(withIdentifier: Constants.segueMyAutoWelcometoAutoList,sender: self)
print("vehicleList is not nil")
}
}
}
}
func didFailWithError(error: Error) {
print(error)
}
}
我要这样做的原因是因为我使用了委托(VehiclemangerDelegate
)在didUpdateVehicleInfo()
函数中将某些数据从另一个屏幕传递到此处。
您能帮我吗?我需要根据API调用(即numberOfVehicle
)中的数据触发 performSegue ,然后使用委托将数据传递到此屏幕。
解决方法
如果我了解您真正的真正问题,那就是您想在numberOfVehilce
中使用viewDidAppear
,但是您想在扩展名中声明该变量。
问题是扩展无法将存储的属性添加到扩展的类中;如果您尝试将该变量声明为委托函数之外的属性,则会从编译器中获取错误。
要解决此问题,请在函数中将其设置为局部变量。
现在,您的问题是您的viewDidAppear
函数无法看到该变量,因为该变量超出范围。然后,您创建了“ viewDidAppear”作为内部函数,以便它可以看到该变量。
这对您不起作用,因为您没有声明视图控制器的'viewDidAppear that is visible to the
UIKit`框架,而是声明了一个具有相同名称的委托函数的内部函数。
您需要将numberOfVehicle
声明为视图控制器本身的属性,而不是扩展名。然后,您既可以在委托方法中也可以在viewDidAppear
中引用它。
class MyAutoWelcomViewController: UIViewController {
var numberOfVehicle = 0
func viewDidAppear(_ animated: Bool) {
self.vehicleManager.delegate = self
// check if vehicle list is nil
self.vehicleManager.getVehicleData() // call api to get the user vehicle list
if numberOfVehilce == 0 {
// show the welcome screen
print("vehicleList is nil")
} else {
// use segue to navigate to the auto list screen
self.performSegue(withIdentifier: Constants.segueMyAutoWelcomeToAutoList,sender: self)
print("vehicleList is not nil")
}
}
}
}
extension MyAutoWelcomViewController: VehicleMangerDelegate {
func didUpdateRdwInfo(rdwData: RdwModel) {
}
func didUpdateVehicleInfo(vehicle: VehicleModel) {
DispatchQueue.main.async {
// code to pass data to a label
print(vehicle.numberOfVehicles)
self.numberOfVehilce = vehicle.numberOfVehicles
self.TestLabel.text = String(numberOfVehilce)
}
但是我仍然有一个顾虑;您尚未显示getVehicleData
的功能,但它指的是API。如果它异步执行以获取数据并调用委托,则您的代码将无法按预期工作,因为viewDidAppear
将在调用委托方法之前完成执行。您可能需要在委托函数中执行segue。
它应该如何工作?您是在代码块中定义局部函数,而不是VC中的viewDidApear
。您不应自己触发视图控制器生命周期方法,而是在需要时由系统触发。您必须重新考虑您的代码。如果您不熟悉iOS开发,请找到Stanford course on Youtube。