我正在寻找解决我问题的方法,但我找不到任何有用的东西。
一些代码:
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
。
我已经尝试在ClassA
中导入ClassB
,但这也不起作用(导入错误)。我听说过有关通知中心的事情,但我以前从未使用过它。
那么,还有另一种方法吗? 感谢
答案 0 :(得分: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类中,当你分配/ init类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类的委托,必须实现委托方法。通过这种机制,您可以来回传递值:)
答案 1 :(得分:1)
您可以通过向前声明ClassB
:
@class ClassB;
在您的ClassA
界面上方,而不是在ClassB.h
中导入ClassA.h
,而是导入ClassA.m
前向声明足够的原因很简单,就是所有编译器需要知道的是ClassB
实际上是你在某处定义的东西。链接器可以找到该定义并将其连接起来。您在#import "ClassB.h"
中ClassA.m
之后的原因是因为您需要了解有关ClassB
的更多信息,而不仅仅是它在实现中的存在。在这种情况下,您需要知道ClassB
具有名为var