gpt4 book ai didi

objective-c - 整个对象属性的 KVO

转载 作者:技术小花猫 更新时间:2023-10-29 11:01:28 24 4
gpt4 key购买 nike

是否可以添加观察者以在任何被监视对象属性被修改时得到通知?例如:

@interface OtherObject : NSObject

@property (nonatomic) MyObject* myObject;

@end

@interface MyObject : NSObject

@property (nonatomic) unsigned int property1;
@property (nonatomic) unsigned int property2;

@end

我想做这样的事情:

[otherObject addObserver:self
forKeyPath:@"myObject"
options:0
context:nil]

并在修改 property1 或 property2 时收到通知。如果我注册持有对象,它似乎不起作用(某种程度上是有道理的,因为例如,当我修改 property1 时,myObject 并没有真正被修改)。

最佳答案

我可以想到两个选项。

  • 您可以创建一个单独的“主”属性并使其依赖于所有其他属性。

    @interface MyObject : NSObject
    @property (nonatomic) id masterProperty;
    @property (nonatomic) unsigned int property1;
    @property (nonatomic) unsigned int property2;
    @end

    + (NSSet *)keyPathsForValuesAffectingMasterProperty {
    return [NSSet setWithObjects:@"property1", @"property2", nil];
    }

    如果您观察 masterProperty,您将在任何属性更改时收到通知。

  • 您使用 Objective-C 运行时获取所有属性的列表并观察它们。

    - (void)addObserverForAllProperties:(NSObject *)observer
    options:(NSKeyValueObservingOptions)options
    context:(void *)context {
    unsigned int count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    for (size_t i = 0; i < count; ++i) {
    NSString *key = [NSString stringWithCString:property_getName(properties[i])];
    [self addObserver:observer forKeyPath:key
    options:options context:context];
    }
    free(properties);
    }

关于objective-c - 整个对象属性的 KVO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12673356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com