在Cocoa中将变量设置在不同的类中

时间:2012-04-27 19:37:09

标签: objective-c cocoa class nsstring

我正在尝试学习如何使用一个主数据类为不同的类设置变量。

这是我想要做的以及我项目中的代码的图表: enter image description here

ClassA的

#import <Foundation/Foundation.h>

@interface ClassA : NSObject {
    NSString *stringA;
    NSString *stringB;
}

@property (nonatomic, copy) NSString *stringA;
@property (nonatomic, copy) NSString *stringB;

@property (weak) IBOutlet NSTextField *textA;
@property (weak) IBOutlet NSTextField *textB;

- (IBAction)displayStrings:(id)sender;

@end

#import "ClassA.h"

@implementation ClassA

@synthesize stringA, stringB, textA, textB;

- (IBAction)displayStrings:(id)sender {
    [textA setStringValue:stringA];
    [textB setStringValue:stringB];
}

@end

X级

#import <Foundation/Foundation.h>

@interface ClassX : NSObject {
    NSMutableString *stringX;
}

- (void)theVariables:(id)sender;

@end

#import "ClassX.h"
#import "ClassA.h"

@implementation ClassX

- (void)awakeFromNib {
    [self theVariables:self];
}

- (void)theVariables:(id)sender {
    stringX = [[NSMutableString alloc] init];

    ClassA *clssA = [[ClassA alloc] init];

    [stringX setString:@"stringX for stringA"];
    [clssA setStringA:stringX];

    [stringX setString:@"stringX for stringB"];
    [clssA setStringB:stringX];
}

@end

代码中没有出现任何错误,但是当我运行程序时,我收到的错误是“无效参数不满意:aString”。看起来IBOutlet的setStringValue不起作用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我没有看到你提到的错误,但据我可以从你的代码中看出,主要问题是这一行:

ClassA *clssA = [[ClassA alloc] init];

您的xib中必须有ClassA的实例,该实例连接到文本字段和按钮。 xib中的那个对象是一个真实的对象,如果你只是在你的代码中的某个地方创建了另一个ClassA的实例,那么你就有了一个完全不同的对象,它与你的xib中没有任何关联。

你需要确保/改变两件事。首先,你的xib中需要有一个ClassX的实例。其次,ClassX需要一个ClassA实例的出口:

@class ClassA;    // Declare ClassA so you can use it below

@interface ClassX : NSObject

@property (weak) IBOutlet ClassA * theClassAInstance;

- (void)theVariables:(id)sender;

@end

然后应该在xib文件中连接哪个。然后,在theVariables:中,您只需使用该商店,而不是创建ClassA的新实例:[[self theClassAInstance] setStringA:@"stringX for stringA"];


三种风格:

首先,您应该在任何触及GUI的类中导入Cocoa.h:#import <Cocoa/Cocoa.h>而不是Foundation.h(在本例中为ClassA)。这就是定义NSTextField之类的东西的地方。它仍然有效,因为Cocoa.h是通过.pch文件导入的,但最好是明确的。

其次,创建一个可变字符串并将其值更改为两个不同的文字字符串并没有多大意义。只需直接使用文字:[clssA setStringA:@"stringX for stringA"];

第三,您不需要单独声明实例变量; @synthesize为您创建它们,现在推荐的做法是声明它们:

@interface ClassA : NSObject

@property (nonatomic, copy) NSString *stringA;
@property (nonatomic, copy) NSString *stringB;

@property (weak) IBOutlet NSTextField *textA;
@property (weak) IBOutlet NSTextField *textB;

- (IBAction)displayStrings:(id)sender;

@end

最后(4分!),您应该通过以下属性访问stringA stringBClassA的值:[textA setStringValue:[self stringA]];