0

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

这是我想做的事情的图表以及我的项目中的代码: 在此处输入图像描述

A类

#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 不起作用。有什么建议么?

4

1 回答 1

1

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

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

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

您需要确保/更改两件事。ClassX首先,您的 xib 中需要有一个 的实例。其次,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"];


风格三点:

首先,您应该#import <Cocoa/Cocoa.h>在任何接触 GUI 的类中导入 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

最后(四点!),您应该真正通过属性访问stringAstringBin的值ClassA[textA setStringValue:[self stringA]];

于 2012-04-27T20:12:01.383 回答