Ios 触发器ViewDid出现在扩展中,或者如何使用viewController扩展中的变量?

Ios 触发器ViewDid出现在扩展中,或者如何使用viewController扩展中的变量?,ios,swift,delegates,viewdidappear,Ios,Swift,Delegates,Viewdidappear,您好,我想将ViewDid显示在我的分机中,但无法触发 参见代码: extension MyAutoWelcomViewController: VehicleMangerDelegate { func didUpdateRdwInfo(rdwData: RdwModel) { } func didUpdateVehicleInfo(vehicle: VehicleModel) { DispatchQueue.

您好,我想将ViewDid显示在我的分机中,但无法触发

参见代码:

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函数可以解决这个问题。