iOS5 中我的 UIView CGRect 属性上的 KVO 不起作用
Posted
技术标签:
【中文标题】iOS5 中我的 UIView CGRect 属性上的 KVO 不起作用【英文标题】:KVO on my UIView CGRect property in iOS5 isn't working 【发布时间】:2012-04-13 13:27:22 【问题描述】:我有一个 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];
observeValueForKeyPath 永远不会被调用,无论我如何更改 MyView 中的 myRect。 setMyRect:在运行时崩溃,我真的不知道为什么。我虽然 synthesize 会处理 setter 和 getter 以及 Keyvalues 和更改。 我也不确定 addObserver: 哪种方式更好,因为我注释掉了我第二次尝试注册 Observer。
我做错了什么?不能观察结构吗?还是仅使用自己编写的 setter 和 getter? 会不会是 UIView 不符合 KVC-Compliant,如果是,为什么会这样? Callback by KVO on a UIView frame property 感谢您的帮助:-)
【问题讨论】:
【参考方案1】:我的解决方案是,我正在使用委托。 控制器是我的视图代表,我认为它应该是这样的, 否则 UIView 将是 KVC 投诉。
【讨论】:
以上是关于iOS5 中我的 UIView CGRect 属性上的 KVO 不起作用的主要内容,如果未能解决你的问题,请参考以下文章