Objective-c: NSMutableDictionary setObject не работает - PullRequest
0 голосов
/ 07 ноября 2010

Не уверен, что я здесь делаю не так. Когда я пытаюсь проверить словарь по определенному ключу или всем клавишам, я получаю сообщение об ошибке или обнулении. (Я знаю, что я использую строку, где я мог бы использовать логическое значение для условного выражения. Мне просто нравится иметь такую ​​проверку, скажем true или false вместо YES и NO. Добавьте это в мой список OCD. в методе 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) отправитель; - (IBAction) setPlayer: (id) отправитель; - (void) showAlert: (NSMutableString *) m; @ Конец

1 Ответ

4 голосов
/ 07 ноября 2010

Убедитесь, что вы инициализируете коллекции в методе -initXXX.Если нет, они будут назначены на nil.

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

Если все, что вы хотите, это "true" и "false", просто определите их самостоятельно.Это не причина использовать строку вместо BOOL.Фактически, Foundation уже определил TRUE и FALSE, кроме YES и NO.

Также, пожалуйста, используйте целое число для activePlayer.

Вы всегда должны сравнивать NSString с -isEqualToString:, а не ==.

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

...

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

Это должно быть причиной того, что p1TeamData всегда равен нулю, поскольку activePlayer == @"1" ненадежен иможет быть материал игрока-1, назначенный на p2TeamData.

...