ios - 从另一个类更新 UILabel

标签 ios class delegates uilabel nsnotificationcenter

我一直在寻找可以解决我的问题的东西,但没有找到任何有用的东西。 一些代码: 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/

相关文章:

c++ - 在命名空间的类中,我可以**仅**类命名空间退出吗?

java - 使用反射检索对象的类名

ios - 为什么我的 iOs 启动器和应用程序图标不适用?

ios - spinnerView 无法在 appdelegate 中工作

json - 如何转义 UIWebView 的字符串?

php - 使用属性从类内部查询 mysql 数据库

ios - 单点触控/iOS : which place is the best one to unsubscribe the delegate

ios - 将委托(delegate)从第三个设置为第一个 viewController

ios - 我应该在哪里声明/实例化我的 Store 对象以使其在应用程序运行时可用?

ios - CIFilter似乎在GPU上失败