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 にとどまる必要があります。間違っている場合は修正してください。

これが私のViewControllerです:

@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: 実行時にクラッシュし、その理由がよくわかりません。私は合成がキー値と変更だけでなく、セッターとゲッターも処理します。オブザーバーを登録する2回目の試みをコメントアウトしたため、 addObserver: のどちらの方法がより良い方法なのかもわかりません。

何が間違っているのですか?構造物を観察することはできませんか?それとも、自己記述のセッターとゲッターだけですか? UIView が KVC に準拠していない可能性があります。そうであれば、なぜこれが機能するのでしょうか? UIView フレーム プロパティでの KVO によるコールバック 助けてくれてありがとう :-)

4

1 に答える 1

0

私の解決策は、デリゲートを使用しています。コントローラーはビューの私のデリゲートです。そうあるべきだと思います。そうでなければ、UIViewはKVC-Complaintになります。

于 2012-04-16T00:22:46.997 に答える