我有一个ViewController和一个UIView,想在CGRect类型的UIView属性上做KVO。由于某种原因,它无法正常工作。我的代码如下所示:
@interface MyView : UIView
@property (nonatomic, assign) CGRect myRect;
@end
@implementation MyView
@synthesize myRect;
...
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
...
//Changing structures values
myRect.origin.x+=moveVector.x;
myRect.origin.y+=moveVector.y;
//assigning new structure
[self setMyRect:CGRectMake(20, 20, 50, 50)];
//Both doesn't call
}
我想用我的视图控制器观察CGRect。不确定我应该在这里对 MVC 有多严格。顺便说一句,MyView中的CGRect只是一个可见的正方形,我可以四处移动,所以我会说它不是一个模型,应该留在MyView中。如果我错了,请纠正它们。
这是我的视图控制器:
@class MyView;
@interface MyViewController : UIViewController
@property (nonatomic, retain) MyView *overlayView;
@end
@implementation MyViewController
@synthesize overlayView;
- (void)viewDidLoad
{
[super viewDidLoad];
overlayView = [[CameraOverlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
[overlayView addObserver:self
forKeyPath:@"myRect"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];
/* [self addObserver:self
forKeyPath:@"overlayView.myRect"
options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld)
context:NULL];*/
self.view = overlayView;
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change context:(void*)context {
if( [keyPath isEqualToString:@"myRect"] ) {
NSLog(@"observeValueForKeyPath");
CGRect rect = [[change valueForKey:NSKeyValueChangeNewKey] CGRectValue];
}
}
observeValueForKeyPath永远不会被调用,无论我在MyView中如何更改myRect。setMyRect:在运行时崩溃,我真的不知道为什么。我虽然合成会照顾二传手和getter以及键值和变化。我也不确定哪种方式 addObserver: 是更好的方法,因为我注释掉了我第二次尝试注册观察者的方法。
我做错了什么?难道不能观察结构吗?还是只有自写的二传手和getter?难道UIView不符合KVC标准,如果是这样,为什么会这样?KVO 对 UIView 帧属性的回调感谢您的任何帮助:-)
我的解决方案是,我正在使用委托。控制器是我的视图代表,我认为它应该是这样,否则UIView将是KVC-Complaint。