观察属性内属性的变化

时间:2015-11-24 11:11:54

标签: ios swift

如果可以将didSet用于属性中的属性,我就会徘徊。

我们假设每次resize()的{​​{1}}属性设置为新值时,我都会调用一个函数text。我尝试使用标签自己的UILabel,但它没有像我期望的那样工作。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

  

它不起作用,正如我所期待的那样

你是什么意思? didSet适用于重写的属性。试试这个:

class MyLabel : UILabel {
    override var text : String? {
        didSet {
            resize()
        }
    }
    private func resize() {
        print("text is now \(text). resizing...")
        frame = CGRectMake(...
    }
}

答案 1 :(得分:0)

可以使用 KVO 跟踪属性修改。在您的视图之后,将初始化对目标标签的引用,您需要添加如下的添加观察者:

to acquire-one-server
  let candidates servers with [ owner = nobody ]
  if any? candidates
  [ ask one-of candidates
    [ set owner myself
      move-to owner
      set heading [heading] of owner
    ]
  ]
end

在你的视图中(你在上面调用的方法相同)你应该有这样的处理程序方法:

[self.label addObserver:self forKeyPath:@"text" 
                options:NSKeyValueObservingOptionNew context:nil];

当您离开视图时,请不要忘记取消订阅:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
                    change:(NSDictionary<NSString *,id> *)change 
                   context:(void *)context {

    // If you subscribed only for one value, you can resize from here or 
    // add conditions.
}

警告[self.label removeObserver:self forKeyPath:@"text" context:nil]; addObserver应该保持平衡。如果您要拨打removeObserver额外的时间,您的申请将会崩溃。