Ios 触发器ViewDid出现在扩展中,或者如何使用viewController扩展中的变量?
您好,我想将ViewDid显示在我的分机中,但无法触发 参见代码:Ios 触发器ViewDid出现在扩展中,或者如何使用viewController扩展中的变量?,ios,swift,delegates,viewdidappear,Ios,Swift,Delegates,Viewdidappear,您好,我想将ViewDid显示在我的分机中,但无法触发 参见代码: extension MyAutoWelcomViewController: VehicleMangerDelegate { func didUpdateRdwInfo(rdwData: RdwModel) { } func didUpdateVehicleInfo(vehicle: VehicleModel) { DispatchQueue.
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
)在didUpdateHicleInfo()
函数中将一些数据从另一个屏幕传递到这里
你能帮我吗?我需要根据来自API调用的数据(即,
numberOfVehicle
)触发性能检查,并使用代理将数据传递到此屏幕。它应该如何工作?您正在代码块中定义局部函数,它不是VC中的viewdiapear
。您不应该自己触发视图控制器生命周期方法,系统会在需要时触发。你必须重新思考你的代码。如果您对iOS开发不熟悉,请查找。如果我理解您真正的问题,那就是您希望在视图中使用numberofevhilce
,但您希望在扩展中声明该变量
问题是扩展无法将存储属性添加到它们扩展的类中;如果试图将该变量声明为委托函数之外的属性,则编译器可能会出错
为了解决这个问题,您将其设置为函数中的局部变量
现在您的问题是,您的viewdide
函数无法看到该变量,因为它超出了范围。然后,您将“viewDidAppear”创建为一个内部函数,以便它可以看到变量
但是,这对您不起作用,因为您没有声明视图控制器的“viewDidAppear”对
UIKit`框架可见,而是声明委托函数的内部函数,该函数恰好具有相同的名称
您需要将numberOfVehicle
声明为视图控制器本身中的属性,而不是扩展中的属性。然后,您可以在委托方法和viewdide
中引用它
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。如果它异步执行以获取数据并调用委托,那么您的代码将无法正常工作,因为在调用委托方法之前,viewdide
将完成执行。您可能需要在委托函数中执行segue。谢谢Prettygeek,您知道如何在扩展中移动变量以用于UIViewcontroller吗?i、 例如,我如何在我的ViewDidAspect函数中使用变量?这个社区不会取代学习,也不会为您编写代码,我给了您一些资料。但是,感谢您的资料。。。我在Stackoverflow中提问是因为我想解决问题,而不是得到应该采取哪门课程的建议。你不需要为我编码,我只需要一些提示。然后我就可以自己解决了。你的回答太笼统了,没有什么帮助。对不起,漂亮的家伙。如果这里没有人回答我的问题,我会自己解决,并接受我自己的答案。原因很简单,我不希望将来有人在谷歌上搜索这个问题,点击,然后看到被接受的答案是参加一门课程。太棒了!谢谢Paulw11!!!!你不仅用一种简单易懂的方式指出了我在扩展方面的不足。现在我完全明白了。我试图声明一个局部变量,至少没有错误。我学会了如何在未来处理这种情况。您的担心是正确的,ViewDidDisplay的执行速度比delegate方法快。将segue移到delegate函数可以解决这个问题。