0

ここで何が間違っているのかわかりません。特定のキーまたはすべてのキーのいずれかで辞書をチェックしようとすると、エラーまたはnullが発生します。(条件にブール値を使用できる文字列を使用していることはわかっています。YESとNOの代わりにtrueまたはfalseと言うチェックを行うのが好きです。これをOCDリストに追加してください。:D)activePlayerが設定されていますawakeFromNibメソッドを1に設定すると、ポップアップボタンを使用してP1とP2を切り替えることができます。

- (IBAction)setPlayer:(id)sender {

 haserror = @"false";
 errmsg = [NSMutableString stringWithCapacity:0];
 [errmsg retain];
 [errmsg appendString: @"There was a problem setting your team up\n\n"];
 thisTeamName = [txtTeamName stringValue];
 thisTeamColor = [pdTeamColor itemTitleAtIndex:[pdTeamColor indexOfSelectedItem]];

 //validate form
 if ([thisTeamName isEqualToString:@""]) {
  haserror = @"true";
  [errmsg appendString: @"You must enter a team name\n\n"];
 }

 if ([thisTeamColor isEqualToString:@"Select A Color"]) {
  haserror = @"true";
  [errmsg appendString: @"You must select a team color\n\n"];
 }

 //check for errors
 if (haserror == @"true")  {
  [self showAlert: errmsg];
 } else { 

  //set up treasury
  treasury = 1000;

  //convert to string for display
  [lblTreasury setStringValue: [NSString stringWithFormat:@"$%i", treasury] ];


  //add items to dictionary
  if (activePlayer == @"1") { 

   [p1TeamData setObject:thisTeamName forKey:@"teamName"];
   [p1TeamData setObject:thisTeamColor forKey:@"teamColor"];
   [p1TeamData setObject:[NSString stringWithFormat:@"%i", treasury] forKey:@"cash"];
  } else { 
   [p2TeamData setObject:thisTeamName forKey:@"teamName"];
   [p2TeamData setObject:thisTeamColor forKey:@"teamColor"];
   [p2TeamData setObject:[NSString stringWithFormat:@"%i", treasury] forKey:@"cash"];
  }

  NSLog(@"%@", [p1TeamData allKeys]);  

 }

 [errmsg release];
}

[編集:これが.hファイルです]

@interface GameController :NSObject {

IBOutlet id btnSaveData;
IBOutlet id lblTreasury;
IBOutlet id pdPickPlayer;
IBOutlet id pdTeamColor;
IBOutlet id txtTeamName;

int activePlayer;
NSString* activePlayerName;
NSString* activePlayerTeamColor;
int  treasury;

NSMutableDictionary* p1TeamData;
NSMutableDictionary* p2TeamData;

NSArray* players;
NSArray* teamColors;
NSArray* unittypes;

NSString* thisTeamName;
NSString* thisTeamColor;

NSMutableString* errmsg;
NSString* haserror;

}

-(void)awakeFromNib; -(IBAction)getPlayer:(id)sender; -(IBAction)setPlayer:(id)sender; -(void)showAlert:(NSMutableString *)m; @終わり

4

1 に答える 1

4

メソッドでコレクションを初期化してください-initXXX。そうでない場合は、に割り当てられnilます。

-(id)initXXX:... {
   if ((self = [super initYYY:...])) {
     ...
     p1TeamData = [[NSMutableDictionary alloc] init];
     p2TeamData = [[NSMutableDictionary alloc] init];
     ...
   }
   return self;
}

「true」と「false」だけが必要な場合は、自分で定義してください。BOOLの代わりに文字列を使用する理由ではありません。実際、Foundationは、YESとNOの他に、TRUEとFALSEをすでに定義しています。

また、には整数を使用してくださいactivePlayer

NSStringは-isEqualToString:、常にではなく、と比較する必要があり==ます。

if ([haserror isEqualToString:@"true"])

...

if ([activePlayer isEqualToString:@"1"])

これが、p1TeamDataが常にnilである理由です。これは、activePlayer == @"1"信頼性が低く、プレーヤー1のものがに割り当てられている可能性があるためですp2TeamData

于 2010-11-07T11:49:16.490 に答える