我一直在寻找可以解决我的问题的东西,但没有找到任何有用的东西。
一些代码:
A类.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
正在改变(我在 ClassB 实现中使用 NSLog 检查了这一点)但这些改变不会影响 label.text
。
我已经尝试过在 ClassB
中导入 ClassA
,但这也不起作用(导入错误)。我听说过有关通知中心的一些信息,但我以前从未使用过它。
那么,还有其他方法吗? 谢谢
最佳答案
只需使用委托(delegate)。在 B 类中,声明一个协议(protocol),以便它可以向 A 类发送回调!
@protocol ClassBProtocol
-(void)classB:(ClassB*)b valueChanged:(float)value;
@end
同时为 B 类声明一个具有委托(delegate)的属性:
@property (nonatomic, assign) id<ClassBProtocol>delegate;
请记住在您的 .m 中综合该委托(delegate)
然后在类 B 中,每当值发生变化时调用该方法:
-(void)methodThatChangesValue {
//here the value will be set
if( self.delegate != nil ) [self.delegate classB:self valueChanged:value];
}
现在在 A 类中,当您分配/初始化 B 类时,将其委托(delegate)设置为 A 类。确保 A 类符合 B 类协议(protocol):
@implementation ClassA () <ClassBProtocol>
@end
...
-(void)viewDidLoad: {
self.classB = [[ClassB alloc] init];
self.classB.delegate = self;
}
现在只需实现B的delegate方法即可!
-(void)classB:(ClassB*)b valueChanged:(float)value {
self.label.text = [NSString stringWithFormat:@"%f", value];
}
基本上发生的情况是 A 类拥有 B 类。现在我们不希望 B 类对 A 类有强引用,因为我们得到了一个保留循环和内存泄漏。因此,我们改为声明类 B 的委托(delegate),这将允许它对拥有它的类具有弱引用。所以A类在这里成为了B类的委托(delegate)。
正因为如此,只要B里面的值发生变化,我们就可以直接调用类A中实现的协议(protocol)方法,因为它是类B的委托(delegate),必须实现委托(delegate)方法。通过这种机制,你可以来回传递值:)
关于ios - 从另一个类更新 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475664/