1

我有一个 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
}

我想用我的 viewController 观察 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];
   }
}

无论我如何在 MyView 中更改 myRect,observeValueForKeyPath 都不会被调用。setMyRect:在运行时崩溃,我真的不知道为什么。我虽然 synthesize 会处理 setter 和 getter 以及 Keyvalues 和更改。我也不确定 addObserver: 的哪种方式更好,因为我注释掉了我第二次尝试注册观察者的尝试。

我在做什么错?不能观察结构吗?还是仅使用自己编写的 setter 和 getter?会不会是 UIView 不符合 KVC-Compliant,如果是,为什么会这样? KVO 在 UIView 框架属性上的回调 感谢您的帮助:-)

4

1 回答 1

0

我的解决方案是,我正在使用委托。控制器是我的视图代表,我认为它应该是这样,否则 UIView 将是 KVC 投诉。

于 2012-04-16T00:22:46.997 回答