在扩展中触发 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 theUIKit”框架,而是您的委托函数的内部函数恰好具有相同的名称.

您需要在视图控制器本身而不是扩展中将 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。