0

Java でしばらくコーディングしているので、OOP には精通していますが、Objective-C で (構文?) 問題が発生しています。ここの他の投稿を見てきましたが、これまでのところ何も役に立ちませんでした。

ボタンを押すだけでプレーヤーの名前を設定するメソッドと、名前を取得して文字列 (NSString*)get_name を返す別のメソッドを持つ "Play_Name.m" という名前のクラスがあります。get_name 関数を呼び出して入力した名前を表示する「Play_ChooseChar.m」という名前の別のクラスもあります。

get_name は、「Play_Name」(所有者) で呼び出すと正しい名前を返しますが、「Play_ChooseChar」で呼び出すと (null) を返します。

//Play_Name code below

#import "Play_Name.h"

@interface Play_Name ()

@end

@implementation Play_Name

@synthesize playerName;
@synthesize textName;


-(IBAction)set:(id)sender {

[self setPlayerName:(self.textName.text)];

if([self.textName.text length] <= 0) {
    playerName = @"Player";
    NSLog(@"YOUR NAME: %@", playerName);
}

NSLog(@"YOUR NAME: %@", playerName);

}

//...........

@end





//Play_ChooseChar code below

#import "Play_ChooseChar.h"
#import "Play_Name.h"

@interface Play_ChooseChar ()

@end

@implementation Play_ChooseChar

@synthesize display_name;
@synthesize playname;
@synthesize boy;
@synthesize girl;
@synthesize isGirl;
@synthesize isBoy;

bool isGirl = FALSE;
bool isBoy = FALSE;

-(void)theName {

Play_Name *pN = [[Play_Name alloc] init];
[pN setPlayerName: pN.playerName];
NSLog(@"NAME: %@", pN.playerName);

self.display_name.text = pN.playerName;
//display_name.text = @"test";

[pN release];

//............

@end

そのため、実行して自分の名前を入力すると、「Play_ChooseChar」の print ステートメントは「NAME: (null)」を返します。

4

4 に答える 4

2

開会の講義: あなたは、Objective-C の慣習を風にそらしているようです。ゲッターは、取得する行為を参照するべきではありません — したがって、実装する必要はnameありません。ほとんど唯一の動詞は、 alaget_nameの意味での「is」です。Objective-C も小文字で始まるキャメル ケースを使用するため、. 同様に、クラスには 3 文字のプレフィックスが必要であり (Objective-C は名前空間を実行しないため)、キャメル ケースにする必要があります (例: .isValidNSTimerplayer_nameplayerNameATPPlayName

講義のポイントはさておき、これ:

Play_Name *play_name = [[Play_Name alloc] init];

の新しいインスタンスを作成しますPlay_Name。他の場所で使用しているインスタンスと同じではありません。そのインスタンスにはまだ名前が付けられていません。次の行で名前を尋ねると、それはnil.

于 2012-11-26T06:17:29.257 に答える
0

設計とコードの規則はさておき: 新しい Play_Name インスタンスを作成すると、その get_name は明らかに nil を返します。これは、コード内のどこにも get_name を呼び出す前に set_name を呼び出していないためです。

最初に行うべきこと: [play_name set_name:@"john"];

そして、set_name メソッドが正しく実装されていると仮定すると、[play_name get_name] は正しい値を返すはずです。

ほとんどのメモリ管理のニュアンスを処理してくれるので、プロパティを使用することを推奨する他の人に賛成します。詳細については、こちらをご覧ください: Objective-C: Declared Properties

于 2012-11-26T06:33:30.440 に答える
0

問題を特定するのに十分なコードを実際に示していません。ただし、独自の命名規則に従うメソッドではなく、プロパティを使用することをお勧めします。例えば:

@interface Player: NSObject
@property NSString* name;
@property NSString* character;
@end

上記はPlayer、プロパティnameおよびを持つクラスを定義しますcharacter。Xcode は、これらのプロパティを「バック」する適切なアクセサ メソッドとインスタンス変数を生成します。詳細については、言語リファレンスを参照してください

于 2012-11-26T06:18:02.050 に答える
0

プロパティを作成する必要があり、xcode はゲッターとセッターを自動的に作成します。

ここを見てください:

于 2012-11-26T06:18:47.033 に答える