我的应用程序类A和类B中有两个类。类A和B都是UIViewController的实例。 A类具有一个按钮,按下该按钮会将B类插入堆栈。 B类具有一个字符串,A类希望观察该字符串并根据需要更新其接口(interface)。我已经可以使用:
B类中的[self addObserver:self forKeyPath:@"name" options:0 context:NULL];可查看对字符串的更改。
当我尝试在A类viewWillAppear方法中使用以下代码时:

ClassB *b = [[ClassB alloc]init];
[b addObserver:self forKeyPath:@"name" options:0 context:NULL];

并添加方法:
(void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object
                      change:(NSDictionary )change
                     context:(void )context

尝试从A查看B在B中所做的更新时,没有采取任何措施。我问这个问题很愚蠢,但是KVO如何在iOS的两个类之间工作?我知道这应该工作。

最佳答案

您可以观察到不同对象/类之间的变化。我认为问题出在addObserver:forKeyPath:options:context:的options参数中。

您想要进行的观察类型有多种选择。 KVO Guide是一个很好的起点,但是您可能想要NSKeyValueObservingOptionNew,我将在下面的示例中使用它。

首先,“名称”应该是ClassB中的公共(public)属性。

其次,您可能不需要在ClassA的viewWillAppear中将观察者添加到“b”,因为您不必在每次出现ClassA View 时都添加观察者。创建ClassB View 时,只需添加一次观察者。添加观察者后,observeValueForKeyPath:ofObject:change:context:方法将在ClassA中执行,因此您可以从那里对ClassA UI进行更新。每当ClassA即将出现时,您都不需要做任何事情。

在类A中,您可能应该在将类B插入 Controller 堆栈之前创建类B,大概是在事件处理程序中针对用户执行的某些操作。在创建ClassB之后,立即将具有正确NSKeyValueObservingOption值的观察者添加到ClassA中。

如果您只想在更改ClassB中的公共(public)属性“名称”时收到通知,请尝试以下操作:

B级

@interface ClassB : UIViewController {
}

@property (retain) NSString* name;

- (void) aMethodThatModifiesName:(NSString*)newName;

@end


@implementation ClassB

@synthesize name;

- (void) aMethodThatModifiesName:(NSString*)newName {
    // do some stuff
    self.name = newName;
}

@end

A类
@interface ClassA : UIViewController {
}

@property (nonatomic, retain) IBOutlet UILabel* nameLabel;

- (IBAction) someEventHandler:(id)sender;

@end

@implementation ClassA

- (IBAction) someEventHandler:(id)sender {
    ClassB* b = [[ClassB alloc]init];
    [b addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];
    [self.navigationController pushViewController:b animated:YES];
    [b release];
}

- (void) observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context {
    if ([keyPath isEqual:@"name"]) {
        NSString* changedName = [change objectForKey:NSKeyValueChangeNewKey];
        // do something with the changedName - call a method or update the UI here
        self.nameLabel.text = changedName;
    }
}

@end

关于iphone - 两类之间的iPhone KVO,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4148833/

10-13 04:36