2012-07-13 140 views
0

我正在寻找解决我的问题的东西,但我没有找到任何有用的东西。 一些代码: ClassA.h更新从另一个类的UILabel

#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正在改变(我检查这ClassB的实施与NSLog的),但这些变化不会影响label.text

我已经尝试在ClassB中也导入ClassA,但是这也不起作用(导入错误)。我听说过有关通知中心的事情,但我从未使用过。

那么,有没有另外一种方法呢? 谢谢

+1

您可以通过在ClassA接口上方向前声明'ClassB':'@class ClassB;'而不导入'ClassB来绕过导入错误。在'ClassA.h'中改为'h',改为'ClassA.m'。 – 2012-07-13 18:12:09

+1

请看这个链接。它有不同的观察/通知方式的解释:http://cocoawithlove.com/2008/06/five-approaches-to-listening-observing.html – Canopus 2012-07-13 18:14:18

+0

@DanF谢谢...它的工作正常! – Vellozo 2012-07-13 18:30:30

回答

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类的委托并且必须实现委托方法。通过这种机制,可以传递值来回:)

+0

我会尽量像你之后说的那样执行。看来,这是做我正在寻找的正确方法。 谢谢你的回答。 – Vellozo 2012-07-13 18:45:04

1

您可以通过向前声明ClassB绕过导入错误:

@class ClassB; 

你上面的ClassA接口,在不ClassA.m进口在ClassA.hClassB.h,而是

正向声明的原因就足够了,简单地说,当时所有编译器都需要知道的是,实际上,ClassB是你定义的某个地方。链接器需要找到该定义并将其挂钩。之所以你#import "ClassB.h"ClassA.m是因为你需要知道更多关于ClassB的信息,它只是在实现中存在。在这种情况下,您需要知道ClassB有一个属性,名称为var