【问题标题】:Can't call method from UIView extension无法从 UIView 扩展调用方法
【发布时间】:2016-11-25 11:11:12
【问题描述】:

我试图通过扩展我的一个自定义 UIView 来调用方法,但我收到错误“'MyCustomView' 类型的值没有成员 'testMethod'”。下面是我的代码

extension MyCustomView {
  func testMethod() {
    //do stuff here
  }
}

//in a separate class from the extension 
class func onMoreOptionsButtonPressed(currentViewController:UIViewController) {
  for view in currentViewController.view.subviews {
    if view.isKindOfClass(MyCustomView) {
      let myCustomView = view as! MyCustomView
      myCustomView.testMethod()
    }
  }
}

显然我可以通过多种不同的方式实现这个功能,但我更感兴趣的是为什么这段代码不能编译,因为它在我看来在逻辑上是正确的。非常感谢所有帮助。

【问题讨论】:

  • 除了缺少的}之外,您的代码对我来说编译得很好
  • 固定支架谢谢。这就是它的奇怪之处。我尝试删除派生数据,退出 Xcode 并重新启动,但它仍然无法编译。它必须与现有架构有关,然后@dan?
  • 将扩展从它自己的单独文件移动到与 MyCustomView 相同的类解决了这个问题,但这不是我更愿意在架构上做的事情,不幸的是仍然没有回答我为什么它会赢的问题'不首先编译。
  • 扩展名似乎只能在创建它们的文件中使用 (stackoverflow.com/questions/24133297/…)。我不确定这一定是真的,但这个问题可能会对你有所帮助。

标签: ios swift uiview swift-extensions


【解决方案1】:

我能想到的唯一答案是您的扩展文件不是您正在编译的目标的成员。选择具有扩展代码的文件并在文件检查器中查看 Target Membership,确保选中您的目标。如果文件不在项目文件夹中,您可能必须将其移到那里才能看到 Target Membership 部分。

【讨论】:

    【解决方案2】:

    这可能与 UIView 是一个 Objective-C 类和方法调度与纯 Swift 类略有不同这一事实有关。

    你可能需要用动态指令声明扩展的方法以满足Obj-C的方法分派机制。

    (我没试过请注意)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-12
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2020-06-29
      相关资源
      最近更新 更多