我需要在 B 类的 A 类中设置一个变量。为了测试这一点,我在 A 类中运行一个 while 循环,通过 NSLog 连续打印该变量。然而,无论我如何尝试,我都无法让 B 类以 A 类可以读取 B 类所做的更改的方式更新 A 类中的变量。我很确定我已在 IB 中正确连接了所有内容。以下是我的设置方法:
//Class A
@interface AppDelegate : NSObject {
NSString *teststring;
}
@property(readwrite,nonatomic,retain) NSString *teststring;
@end
@implementation AppDelegate
@synthesize teststring;
-(id)init{
self = [super init];
if(self) {
teststring = [[NSString alloc] init];
}
return self;
}
-(void)awakeFromNib
{
while(1){
NSLog(@"teststring is %@",teststring);
usleep(500000);
}
}
@end
//Class B
@class AppDelegate;
@interface otherClass : NSObject {
AppDelegate *appdel;
}
-(IBAction)doTest:(id)sender;
@end
@implementation otherClass
-(void)awakeFromNib
{
appdel = [[AppDelegate alloc] init];
}
-(void)doTest:(id)sender
{
appdel.teststring = @"Test";
NSLog(@"Set teststring to %@",appdel.teststring); //this works
}
@end
最佳答案
您对类(看似代码的某种“部门”)考虑太多,而对对象考虑得不够,您的措辞和问题都证明了这一点。
您的 otherClass 实例创建了 AppDelegate
类的第二个实例。您已经有一个 AppDelegate 实例,它是实际的应用程序委托(delegate)(因为我假设您的 Nib 中有它,并且已将其连接到应用程序的 delegate 导出)那里);现在,在 -[otherClass awakeFromNib]
中,您正在创建另一个。
然后,您告诉第二个 AppDelegate
实例将其 teststring
属性设置为 @"Test"
,然后您询问第二个 AppDelegate
实例来获取该属性的值,而您的第二个 AppDelegate
实例会尽职尽责地向您显示您为其提供的值。
第一个实例的 teststring
属性值不同,因为 otherClass
对象从未为该实例提供 teststring
值> 属性(property)。请注意,您在 @interface 部分中定义的变量是实例变量,这就是为什么类的不同实例可以并且通常在这些变量中具有不同的值。属性同样是每个实例的,通常由这些实例变量支持。
AppDelegate
A(真正的应用程序委托(delegate),在 Nib 中创建)和 AppDelegate
B(由 otherClass
对象创建,而不是任何委托(delegate)) 是 AppDelegate
的两个单独实例,具有单独的 teststring
变量。
因此,解决方案是:让 otherClass
实例与真正的应用程序委托(delegate)通信,而不是与它自己创建的 AppDelegate
实例通信。您可以向应用程序请求其委托(delegate),或者(如果 otherClass
对象位于 MainMenu Nib 中)为其提供一个应用程序委托(delegate)的导出,就像应用程序一样。
但是,在应用程序委托(delegate)类中堆放太多内容是糟糕的设计;每个类都应该有一个特定的目的,并且通常应该完全适合模型、 View 和 Controller 分类之一。因此,假设您的 otherClass
对象应该是一个 Controller ,请将属性移动到 otherClass
中,并使该对象成为需要该属性的任何对象的 Controller 。
关于iphone - 如何从一个类中更新另一个类中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3482283/