0

1 つのメイン データ クラスを使用して、さまざまなクラスの変数を設定する方法を学習しようとしています。

これは、私がやりたいことと私のプロジェクトのコードの図です。 ここに画像の説明を入力

クラス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];

ClassAテキストフィールドとボタンに接続されている xib にのインスタンスが必要です。xib 内のそのオブジェクトは実際のオブジェクトでありClassA、コード内のどこかに別のインスタンスを作成するだけでは、xib 内のオブジェクトとはまったく関係のないまったく別のオブジェクトになります。

2つのことを確認/変更する必要があります。まず、ClassXxib に のインスタンスが必要です。次に、インスタンス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"];


スタイルの3つのポイント:

#import <Cocoa/Cocoa.h>まず、 GUI に触れるすべてのクラス (ClassAこの場合)の Foundation.h の代わりに、 Cocoa.h: をインポートする必要があります。それは、次のようなものNSTextFieldが定義されている場所です。Cocoa.h は .pch ファイルを介してインポートされるため、とにかく動作しますが、明示的に指定することをお勧めします。

第 2 に、変更可能な文字列を作成し、その値を 2 つの異なるリテラル文字列に変更することは、あまり意味がありません。リテラルを直接使用するだけです。[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 ポイント!)、実際にはプロパティを介してstringAstringBinの値にアクセスする必要があります。ClassA[textA setStringValue:[self stringA]];

于 2012-04-27T20:12:01.383 に答える