Заполнение NSDictionary и NSArrays для данных модели - PullRequest
0 голосов
/ 05 марта 2012

Я пытаюсь создать NSDictionary полный массив в файле реализации моей модели, но мой код пока не работает.Я хочу создать массивы, которые представляют собой списки типов собак и кошек, а затем добавить эти массивы в словарь с ключами DOG и CAT.Вот мой код:

@implementation wordDictionary

@synthesize catList = _catList;
@synthesize dogList = _dogList;
@synthesize standardDictionary =_standardDictionary;
- (void)setCatList:(NSMutableArray *)catList
{
     self.catList = [NSMutableArray arrayWithObjects:@"lion", @"puma", @"snow leopard", nil]; 
}
- (void)setDogList:(NSMutableArray *)dogList
{
    self.dogList = [NSMutableArray arrayWithObjects:@"pit bull", @"pug", @"chihuahua", nil];
}
-(void)setStandardDictionary:(NSMutableDictionary *)standardDictionary 
{
    [self.standardDictionary setObject: _catList forKey:@"CAT"];
    [self.standardDictionary setObject: _dogList forKey:@"DOG"];
}

- (NSString*)selectKey    
{
    NSInteger keyCount = [[self.standardDictionary allKeys] count];
    NSInteger randomKeyIndex = arc4random() % keyCount;
    NSString *randomKey = [[self.standardDictionary allKeys] objectAtIndex:randomKeyIndex];
    return randomKey;
}
@end

Этот код является моделью.Модель подключена к моему контроллеру представления так, что когда пользователь нажимает кнопку, NSString, возвращаемый из randomKey, отображается в метке на экране.Таким образом, текст будет читать либо CAT, либо DOG.Вот код для этого:

- (IBAction)changeGreeting:(UIButton*)sender {
    NSString *chosenKey = [self.dictionary selectKey];
    NSString *labelText = [[NSString alloc] initWithFormat:@"%@", chosenKey];
    self.label.text = labelText;
}

К сожалению, когда я нажимаю кнопку на симуляторе, я получаю сообщение об ошибке: Thread 1:EXC_ARITHMETIC (code=EXC_1386_DIV, subcode=0x0) в NSInteger randomKeyIndex = arc4random() % keyCount;, и кажется, что я получаю его, потому что ни мойNSArray ни у моего NSDictionary нет никаких предметов внутри них.

Кто-нибудь знает, почему мои NSArray и NSDictionary не были заполнены?

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 05 марта 2012

Простой ответ заключается в том, что здесь нет никакого кода, который вызывает методы для установки массивов или словаря.

Но настоящая основная проблема заключается в том, что здесь происходит несколько плохих «шаблонов», которые вы должны исправить:

В ваших методах установки (setCatList :, setDogList :, setStandardDictionary :) вы не устанавливаете свойства, о которых идет речь, в значения, которые передаются. Например, вы должны устанавливать catList для переданной в переменную "catList" .

- (void)setCatList:(NSMutableArray *)catList
{
    if (_catList != catList) {
      [_catList release];
      _catList = [catList retain];
    }
}

Тогда у вас должна произойти какая-то «настройка», обычно в методе в контроллере вида, таком как viewDidLoad:

[wordDictionary setCatList:[NSMutableArray arrayWithObjects:@"lion", @"puma", @"snow leopard", nil]]; 
// and more for the other two setters

Кроме того, вы можете установить эти значения по умолчанию в init для класса wordDictionary:

- (id)init {
    self = [super init];
    if (self) {
        [self setCatList:[NSMutableArray arrayWithObjects:@"lion", @"puma", @"snow leopard", nil]]; 
    }
    return self;
}

Первое лучше в большинстве случаев, но у вас может быть веская причина для предварительного заполнения вашей модели для всех экземпляров класса.

2 голосов
/ 05 марта 2012

Предполагая, что вы звонили setCatList:, setDogList: и setStandardDictionary: раньше. Вероятно, причина этого такова:

 NSString *chosenKey = [self.dictionary selectKey];

изменить на это:

 NSString *chosenKey = [self selectKey]; 

UPDATE

Я пытаюсь сделать вашу жизнь проще. не нужно создавать свой объект, если вам не нужно больше всего.

- (NSMutableArray*)getCatList
{
     return [NSMutableArray arrayWithObjects:@"lion", @"puma", @"snow leopard", nil]; 
}
- (NSMutableArray*)getDogList
{
   return [NSMutableArray arrayWithObjects:@"pit bull", @"pug", @"chihuahua", nil];
}
-(NSMutableDictionary*)getStandardDictionary 
{
    NSMutableDictionary *standardDictionary = [NSMutableDictionary new];
    [standardDictionary setObject:[self getCatList] forKey:@"CAT"];
    [standardDictionary setObject:[self getDogList] forKey:@"DOG"];
    return [standardDictionary autorelease];
}

- (NSString*)selectKey    
{
    NSMutableDictionary *standardDictionary = [self getStandardDictionary];
    NSInteger keyCount = [[standardDictionary allKeys] count];
    NSInteger randomKeyIndex = arc4random() % keyCount;
    NSString *randomKey = [[standardDictionary allKeys] objectAtIndex:randomKeyIndex];
    return randomKey;
}

- (IBAction)changeGreeting:(UIButton*)sender {
   // NSString *chosenKey = [self selectKey];
    //NSString *labelText = [[NSString alloc] initWithFormat:@"%@", chosenKey];
    self.label.text = [self selectKey]; //no need to convert it to NSString again
}
1 голос
/ 05 марта 2012

Две вещи, на которые стоит обратить внимание:

Я не вижу, чтобы вы вызывали их:

setCatList:(NSMutableArray*)catList;
setDogList:(NSMutableArray*)dogList;

Вы используете self.catList и self.dogList, но вместо этого ни один из них не синтезируется.у вас есть синтезированные beatList и meList

Измените синтез на catList и dogList и убедитесь, что вы вызываете методы set-списка, и тогда вы должны добиться определенного прогресса.

...