代码之家  ›  专栏  ›  技术社区  ›  Michael Hulet

使用swift 3 keypath引用uiview子类.center

  •  2
  • Michael Hulet  · 技术社区  · 7 年前

    在我的应用程序中的视图控制器中,我通过观察 center 属性,如下所示:

    class CoordinatingViewController: UIViewController {
    
        @IBOutlet weak var cardContainerView: CardView!
    
        override func viewDidLoad() {
             super.viewDidLoad()
             addObserver(self, forKeyPath: "cardContainerView.center", options: [.new], context: nil)
        }
    }
    

    目前这工作还不错,但是由于密钥路径是一个字符串,编译器无法检查它。为了缓解这种情况,我想使用SWIFT 3 #keyPath() 语法,它接受编译器检查的密钥路径并返回正确的对应字符串。但是,当我将该行改为这样使用时:

    addObserver(self, forKeyPath: #keyPath(cardContainerView.center), options: [.new], context: nil)
    

    编译器给出了两个错误:

    1. 键入“cardview!”没有成员“center”
    2. 不能在“cardview!”类型的实例中引用类型成员“center”

    我不明白为什么我会犯这些错误 center 是记录在案的财产 UIView ,其中 CardView 直接继承,我可以在 #密钥路径() 陈述一下。此外,当我以字符串的形式直接传递密钥路径时,一切似乎都正常工作,如我的第一个示例中所示,这使得这更加令人困惑。我如何让编译器为我检查密钥路径?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sweeper    7 年前

    斯威夫特似乎不喜欢 weak 修饰语。删除它,代码就会编译。从 this ,我们可以看到,除非你真的有一个保留周期,否则建议销售点要强大。看我的答案 here 如何找到保留周期。

    在SWIFT 4中,您可以使用新的 \ 密钥路径语法:

    // no problems with "weak"!
    let observation = observe(\.cardContainerView.center) { (object, change) in
        ...
    }