在扩展中触发 viewDidAppear 或如何在 viewController 中使用扩展中的变量?
trigger viewDidAppear in extension or how to use variable from extension in viewController?
您好,我想将 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)
}
}
我想这样做的原因是因为我在 didUpdateVehicleInfo()
函数中使用委托 (VehicleMangerDelegate
) 将一些数据从另一个屏幕传递到此处。
你能帮我解决这个问题吗?我需要根据来自 API 调用(即 numberOfVehicle
)的数据触发 performSegue,并使用委托将数据传递到此屏幕。
它应该如何运作?您在代码块内定义局部函数,它不是 VC 中的 viewDidApear
。你不应该自己触发视图控制器生命周期方法,系统会在需要时触发。您必须重新考虑您的代码。如果您刚接触 iOS 开发,请查找 Stanford course on Youtube.
如果我理解你真正的问题,那就是你想在 viewDidAppear
中使用 numberOfVehilce
,但你想在扩展中声明该变量。
问题在于扩展无法将存储的属性添加到它们扩展的类;如果您试图将该变量声明为委托函数外的 属性,编译器会报错。
为了解决这个问题,您将其设为函数中的局部变量。
现在您的问题是您的 viewDidAppear
函数无法看到该变量,因为它超出了范围。然后,您将“viewDidAppear”创建为内部函数,以便它可以看到变量。
虽然这对您不起作用,因为您没有声明视图控制器的“viewDidAppearthat 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。
您好,我想将 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)
}
}
我想这样做的原因是因为我在 didUpdateVehicleInfo()
函数中使用委托 (VehicleMangerDelegate
) 将一些数据从另一个屏幕传递到此处。
你能帮我解决这个问题吗?我需要根据来自 API 调用(即 numberOfVehicle
)的数据触发 performSegue,并使用委托将数据传递到此屏幕。
它应该如何运作?您在代码块内定义局部函数,它不是 VC 中的 viewDidApear
。你不应该自己触发视图控制器生命周期方法,系统会在需要时触发。您必须重新考虑您的代码。如果您刚接触 iOS 开发,请查找 Stanford course on Youtube.
如果我理解你真正的问题,那就是你想在 viewDidAppear
中使用 numberOfVehilce
,但你想在扩展中声明该变量。
问题在于扩展无法将存储的属性添加到它们扩展的类;如果您试图将该变量声明为委托函数外的 属性,编译器会报错。
为了解决这个问题,您将其设为函数中的局部变量。
现在您的问题是您的 viewDidAppear
函数无法看到该变量,因为它超出了范围。然后,您将“viewDidAppear”创建为内部函数,以便它可以看到变量。
虽然这对您不起作用,因为您没有声明视图控制器的“viewDidAppearthat 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。