0

不知道我在这里做错了什么。当我尝试通过特定键或 allkeys 检查字典时,我会得到错误或 null。(我知道我正在使用一个字符串,我可以在其中使用布尔值作为条件,我只是喜欢这样的检查,说真或假而不是 YES 和 NO。将其添加到我的强迫症列表中。: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;

}

-(无效) 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;
}

如果您想要的只是“真”和“假”,您只需自己定义它们。这不是使用字符串而不是 BOOL 的理由。事实上,除了 YES 和 NO,Foundation 已经定义了 TRUE 和 FALSE。

另外,请使用整数activePlayer

您应该始终将 NSString 与 进行比较-isEqualToString:,而不是==.

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

...

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

这应该是为什么p1TeamData总是 nil 的原因,因为activePlayer == @"1"它不可靠并且可能有 player-1 的东西分配给p2TeamData.

于 2010-11-07T11:49:16.490 回答