【问题标题】:Why can't I access the delegate property of my view controller in my Swift project?为什么我不能在我的 Swift 项目中访问我的视图控制器的委托属性?
【发布时间】:2021-03-02 02:42:29
【问题描述】:

我有一个名为 ServiceDetailController 的视图控制器,其委托属性如下所示:

weak var delegate: ServiceDetailControllerDelegate?

我正在尝试使用导航堆栈中下一个视图控制器中的委托实例对其进行初始化:

for controller in navigationController!.viewControllers as Array {
    if controller.isKind(of: ServiceDetailController.self) {
        controller.delegate = self
    }
}

但是 Xcode 给了我一个错误

“UIViewController”类型的值没有成员“委托”。

感谢您的任何帮助。

【问题讨论】:

    标签: swift xcode uiviewcontroller delegates


    【解决方案1】:

    您的代码在运行 if 语句之后的代码之前确认控制器的类型为 ServiceDetailController,但在 if 语句中,变量 controller 仍然是 ViewController 类型。 (实际上,由于您将navigationController!.viewControllers 转换为Array,controller 可能是Any 类型。我会从您的for 循环中删除as Array 位。它弊大于利。)

    您需要将变量转换为正确的类型才能访问特定子类的属性。更改代码如下:

        for controller in navigationController!.viewControllers {
            if let sdc = controller as? ServiceDetailController {
                sdc.delegate = self
            }
        }
    

    if let 语法称为“可选绑定”,它在 if 语句的大括号内创建一个新变量,如果 if let 成功,则该变量有效。在我们的例子中,我们使用as? 来尝试将视图控制器转换为类型ServiceDetailController。如果转换成功,则执行大括号内的代码,并可以访问变量sdc,其类型为ServiceDetailController。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 2015-10-15
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多