0

我一直在寻找可以解决我的问题的东西,但我没有找到任何有用的东西。一些代码: ClassA.h

#import "ClassB.h"

@interface ClassA : UIViewController
{
   ClassB *clsB;
}

@property (retain, nonatomic) IBOutlet UILabel  *label;
@property (retain, nonatomic) ClassB *clsB;

ClassA.m

@implamentation ClassA
@synthesize label, clsB;

- (void)viewDidLoad
{
   ...
   clsB = [[ClassB alloc] init];
   label.text = [[NSString stringWithFormat:@"%f", clsB.var];
   ...
}

问题是它var正在发生变化(我在使用 NSLog 的 ClassB 实现中检查了这一点),但这些变化不会影响label.text.

我也已经尝试过导入ClassAClassB但这也不起作用(导入错误)。我听说过有关通知中心的一些信息,但我以前从未使用过它。

那么,还有其他方法可以做到这一点吗?谢谢

4

2 回答 2

1

只需使用代表。在 B 类中,声明一个协议,以便它可以向 A 类发送回调!

@protocol ClassBProtocol
-(void)classB:(ClassB*)b valueChanged:(float)value;
@end

还要为 B 类声明一个具有委托的属性:

@property (nonatomic, assign) id<ClassBProtocol>delegate;

请记住在您的 .m 中合成该委托

然后在 B 类中,每当值更改时调用该方法:

-(void)methodThatChangesValue {
    //here the value will be set
    if( self.delegate != nil ) [self.delegate classB:self valueChanged:value];
}

现在在 A 类中,当您分配/初始化 B 类时,将其委托设置为 A 类。确保 A 类符合 B 类协议:

@implementation ClassA () <ClassBProtocol>
@end
...
-(void)viewDidLoad: {
    self.classB = [[ClassB alloc] init];
    self.classB.delegate = self;
}

现在只需实现 B 的委托方法!

-(void)classB:(ClassB*)b valueChanged:(float)value {
    self.label.text = [NSString stringWithFormat:@"%f", value];
}

基本上发生的情况是类 A 拥有类 B。现在我们不希望类 B 对类 A 具有强引用,因为我们得到了一个保留周期和内存泄漏。因此,我们声明了一个类 B 的委托,这将允许它对拥有它的类具有弱引用。所以A类在这里成为B类的代表。

正因为如此,每当B内部的值发生变化时,我们就可以调用A类中实现的协议方法,因为它是B类的委托,必须实现委托方法。通过这种机制,您可以来回传递值:)

于 2012-07-13T18:28:48.557 回答
1

您可以通过转发声明绕过导入错误ClassB

@class ClassB; 

在您的ClassA界面上方,而不是导入ClassB.hClassA.h而是导入ClassA.m

前向声明就足够的原因很简单,编译器在这一点上需要知道的ClassB是,事实上,你已经在某个地方定义了一个东西。由链接器找到该定义并将其连接起来。您之所以加入#import "ClassB.h"ClassA.m是因为您需要了解ClassB的不仅仅是实现中存在的更多信息。在这种情况下,您需要知道ClassB有一个名为var

于 2012-07-13T18:33:21.553 回答