假设我有一个名为FooBox的自定义控件。它只是屏幕上的一个正方形。它有一些属性,如颜色,边框等。当我更改属性时,我希望FooBox重绘自身以反映其新属性。有没有办法在不编写自定义setter并将[self setNeedsDisplay:YES]放入所有这些内容的情况下执行此操作?
答案 0 :(得分:5)
我不确定这是否是正确的方法,但您可以考虑使用NSKeyValueObserving
并将对象注册为自身的观察者,并在-observeValueForKeyPath:ofObject:change:context:
方法中重绘。 / p>
答案 1 :(得分:2)
假设您的类与要触发重新显示的属性符合KVC,当密钥与您的某个属性匹配时,我会覆盖-didChangeValueForKey:
方法以调用[self setNeedsDisplay]
。我认为这比Peter的覆盖-setValue的方法稍好一点:forKey:因为它不会妨碍正常的KVC机制并且不需要他提到的拳击。
- (void)didChangeValueForKey:(NSString*)key {
if ([@"propertyOne" isEqualToString:Key] ||
....) {
[self setNeedsDisplay];
}
[super didChangeValueForKey:key]; // <- Don't forget this
}
答案 2 :(得分:1)
另外两种方式:
setNeedsDisplay:YES
。并非总是可能,也不乏麻烦。setValue:forKey:
以向其添加setNeedsDisplay:
消息,并使用该消息设置视图的属性。这将需要装箱任何数字或结构值,这是另一个麻烦。所以,实际上,没有。
答案 3 :(得分:0)
我不知道一个。如果它足够困扰我,我会给自己写几个宏来做这个技巧。
答案 4 :(得分:0)
如果通过NSControl更改属性,则可以始终放置
[theView setNeedsDisplay:YES]
在NSControl发送的动作中。