在扩展程序中触发viewDidAppear或如何在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)
    }

}

我要这样做的原因是因为我使用了委托(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