2011-09-01 2 views
0

A -> B подтаблицы (viewcontroller.view) -> Presentmodalviewcontroller (C)presentmodalviewcontroller вопрос

Моя вторая страница: (B) код

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    

[currentElement release]; 
currentElement = [elementName copy]; 


if ([elementName isEqualToString:@"result"]) { 

    Prodid = [[NSMutableString alloc] init]; 

     } 
} 
  • (аннулируются) parserDidEndDocument: (NSXMLParser *) парсер { страница * login = [[page alloc] init];
    login.prodid = Prodid;
    login.categid = self.categid;
    UINavigationController * navCtrl = [[UINavigationController alloc] initWithRootViewController: login];
    [self presentModalViewController: navCtrl анимированный: ДА];
    [версия для входа];
    [navCtrl release];
    [Выпуск Prodid];
    }

в моей следующей странице (C) есть одна кнопка отмены

-(void) cancel 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

если я нажмите кнопку отмены приложение аварии .I проверки nszombie и найти overreleased объект (PRODID). Если я удалю [Prodid release], приложение работает, но протекает в Prodid.How я могу решить эту проблему.

+0

Что такое 'тип'' Prodid'? – EmptyStack

+0

@EmptyStack Mutablestring проверить мой отредактированный вопрос – Rams

+0

Как 'prodid' отклоняется в вашем классе' page'? – Nekto

ответ

0

Вы должны ckeck в отладчике часть кода, где ваше приложение разбилось. Из вашего описания я предполагаю, что вы пытаетесь отправить сообщение clearModalViewController на navCtl, а не его владельцу.

[self.parentViewController dismissModalViewControllerAnimated:YES]; 
+0

как отправить владельцу.check мои отредактированные вопросы – Rams

+0

Я добавил код в мое сообщение. – Morion

0

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

Подумайте об этом так: Представление модального контроллера дает свое вид собственности. Ваш второй контроллер просмотра СОБИРАЕТСЯ первым контроллером представления и СОБСТВЕННЫМ. Поэтому вызов '[self rejectModalViewControllerAnimatied: YES]' завершается с ошибкой, потому что второй контроллер представления НЕ имеет модального контроллера.

Как правило, в этой ситуации я установил какое-то отношение делегата между «базовым» контроллером вида и модальным. Вы также можете добавить цель к кнопке отмены из «базового» контроллера просмотра при ее настройке.

Может быть, как это:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{    
    [currentElement release]; 
    currentElement = [elementName copy]; 
    if ([elementName isEqualToString:@"result"]) { 
     Prodid = [[NSMutableString alloc] init]; 
    } 
    page *login=[[page alloc]init]; 
    login.prodid = Prodid; 
    login.categid=self.categid; 
    UINavigationController *navCtrl= [[UINavigationController alloc] initWithRootViewController:login]; 
    [[login cancelButton] addTarget:self action:@selector(cancel) forControlEvents:UIControlEventTouchUpInside]; 

    [self presentModalViewController:navCtrl animated:YES]; 
    [login release]; 
    [navCtrl release];  
} 

-(void) dealloc 
{  
    [Prodid release]; 
} 

// Put this method in the "base" view controller, NOT the modal one 
-(void) cancel 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

@ mbm30075 Я получаю предупреждение в 'UINavigationController' может не отвечать на '-cancelButton' – Rams

+0

@Rams: Обновлен код для исправления моих ошибок. – mbm29414

0

Ваш код странно, то, что произойдет, если ваш ELEMENTNAME = @ «результат», что значение PRODID в этом случае?

Я думаю, вам нужно установить PRODID = ноль после освобождения его:

[Prodid release]; 
Prodid = nil; 
+0

Вы избили меня до 11 секунд! – mydogisbox

+0

Lol, но ваш ответ более подробный, чем мой, голосуйте за вас;) – Johnmph

1
if ([elementName isEqualToString:@"result"]) { 

    Prodid = [[NSMutableString alloc] init]; 

     } 
} 
[Prodid release]; 

Вы не всегда выделяют PRODID, прежде чем отпустить. Измените свой код, чтобы его только отпустить, если вы его выделите.Возможно

if ([elementName isEqualToString:@"result"]) { 

    Prodid = [[NSMutableString alloc] init]; 

} 
else 
{ 
    Prodid = nil; 
} 
[Prodid release]; 
Prodid = nil; 

Это будет работать, потому что сообщения, отправленные в нуль, ничего не делают.

+0

'else {Prodid = nil; } 'не требуется, если вы правильно очищаете в другом месте. – mydogisbox

Смежные вопросы