从另一个类更新UILabel

时间:2012-07-13 17:48:12

标签: ios class delegates uilabel nsnotificationcenter

我正在寻找解决我问题的方法,但我找不到任何有用的东西。 一些代码: 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,但这也不起作用(导入错误)。我听说过有关通知中心的事情,但我以前从未使用过它。

那么,还有另一种方法吗? 感谢

2 个答案:

答案 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

的属性