我正在尝试学习如何使用一个主数据类为不同的类设置变量。
这是我想要做的以及我项目中的代码的图表:
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不起作用。有什么建议吗?
答案 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
stringB
和ClassA
的值:[textA setStringValue:[self stringA]];