Странная ситуация при попытке pushView с объектом - PullRequest
0 голосов
/ 08 декабря 2011

Итак, вот сделка. В моем xib есть 16 кнопок, каждая из которых в своем контроллере имеет следующий код:

IBOutlet UIButton *left1;
IBOutlet UIButton *left2;
IBOutlet UIButton *left3;
IBOutlet UIButton *left4;
IBOutlet UIButton *left5;
IBOutlet UIButton *left6;
IBOutlet UIButton *left7;
IBOutlet UIButton *left8;
IBOutlet UIButton *right1;
IBOutlet UIButton *right2;
IBOutlet UIButton *right3;
IBOutlet UIButton *right4;
IBOutlet UIButton *right5;
IBOutlet UIButton *right6;
IBOutlet UIButton *right7;
IBOutlet UIButton *right8;

Когда одна из них нажата, она должна выдвигать вид с объектом в зависимости от того, какая кнопка была нажата. Вот как я это сделал:

if (upperLower.selectedSegmentIndex == 0) {
    if (sender == left1) {
        aTooth = [aPatient.teeth objectForKey:@"11"];
    } else if (sender == left2) {
        aTooth = [aPatient.teeth objectForKey:@"12"];
    } else if (sender == left3) {
        aTooth = [aPatient.teeth objectForKey:@"13"];
    } else if (sender == left4) {
        aTooth = [aPatient.teeth objectForKey:@"14"];
    } else if (sender == left5) {
        aTooth = [aPatient.teeth objectForKey:@"15"];
    } else if (sender == left6) {
        aTooth = [aPatient.teeth objectForKey:@"16"];
    } else if (sender == left7) {
        aTooth = [aPatient.teeth objectForKey:@"17"];
    } else if (sender == left8) {
        aTooth = [aPatient.teeth objectForKey:@"18"];
    } else if (sender == right1) {
        aTooth = [aPatient.teeth objectForKey:@"21"];
    } else if (sender == right2) {
        aTooth = [aPatient.teeth objectForKey:@"22"];
    } else if (sender == right3) {
        aTooth = [aPatient.teeth objectForKey:@"23"];
    } else if (sender == right4) {
        aTooth = [aPatient.teeth objectForKey:@"24"];
    } else if (sender == right5) {
        aTooth = [aPatient.teeth objectForKey:@"25"];
    } else if (sender == right6) {
        aTooth = [aPatient.teeth objectForKey:@"26"];
    } else if (sender == right7) {
        aTooth = [aPatient.teeth objectForKey:@"27"];
    } else if (sender == right8) {
        aTooth = [aPatient.teeth objectForKey:@"28"];
    }
} 
else {
    if (sender == left1) {
        aTooth = [aPatient.teeth objectForKey:@"41"];
    } else if (sender == left2) {
            aTooth = [aPatient.teeth objectForKey:@"42"];
    } else if (sender == left3) {
            aTooth = [aPatient.teeth objectForKey:@"43"];
    } else if (sender == left4) {
            aTooth = [aPatient.teeth objectForKey:@"44"];
    } else  if (sender == left5) {
            aTooth = [aPatient.teeth objectForKey:@"45"];
    } else  if (sender == left6) {
            aTooth = [aPatient.teeth objectForKey:@"46"];
    } else  if (sender == left7) {
            aTooth = [aPatient.teeth objectForKey:@"47"];
    } else  if (sender == left8) {
            aTooth = [aPatient.teeth objectForKey:@"48"];
    } else  if (sender == right1) {
            aTooth = [aPatient.teeth objectForKey:@"31"];
    } else  if (sender == right2) {
            aTooth = [aPatient.teeth objectForKey:@"32"];
    } else  if (sender == right3) {
            aTooth = [aPatient.teeth objectForKey:@"33"];
    } else  if (sender == right4) {
            aTooth = [aPatient.teeth objectForKey:@"34"];
    } else  if (sender == right5) {
            aTooth = [aPatient.teeth objectForKey:@"35"];
    } else  if (sender == right6) {
            aTooth = [aPatient.teeth objectForKey:@"36"];
    } else  if (sender == right7) {
            aTooth = [aPatient.teeth objectForKey:@"37"];
    } else  if (sender == right8) {
            aTooth = [aPatient.teeth objectForKey:@"38"];
    }
}
toothController.aTooth = aTooth;
toothController.aPatient = aPatient;

if (aTooth) {
    [self.navigationController pushViewController:toothController animated:YES];    
} else {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Tooth not found" message:@"The patient doesn't have that tooth" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil];
    [alert show];
    [alert release];
}
[aTooth release];

Теперь проблема в том, что я не могу понять, почему, если я нажимаю left1, left2 или left3, это работает отлично. Теперь, если я нажимаю left4, происходит сбой, иногда с исключением (NSCFArray номер нераспознанный селектор отправил blalbal), а иногда и без него. Все зубы с номерами 11, 12, 13 и 14 существуют в массиве. Я пробовал их только потому, что мне было лень создавать 36 из них. Но почему это не работает только для числа 14?

Я пытался понять это часами безуспешно. Любая помощь приветствуется.

ОБНОВЛЕНИЕ: (Последнее обновление было неверным) Я удалил зубы № 14 из xml, из которого были проанализированы зубы, и добавил зуб № 15. Проблема сохраняется с зубами № 15 и показывает правильное сообщение (зуб не существует) для зуба № 14.

ОБНОВЛЕНИЕ 2: Я добавил «aTooth = nil» после [релиза aTooth], и теперь я могу получить доступ к зубам 15, но я не могу получить доступ к зубам дважды. Получив доступ к зубу, я не могу вернуться туда без повторной компиляции.

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

objectForKey: - это метод NSDictionary.Вы получаете исключение, которое указывает, что teeth является NSArray.Я полагаю, что вы хотите использовать

aTooth = [aPatient.teeth objectAtIndex:some-index];
0 голосов
/ 08 декабря 2011

[aTooth release] - ???Итак, вы освобождаете объект после извлечения его из словаря?

...