dismissModalViewController вызывает сбой - PullRequest
0 голосов
/ 16 октября 2011

Я пытался отладить эту проблему часами, но безуспешно. У меня есть кнопка, которая при нажатии просто делает это:

[self.parentViewController dismissModalViewControllerAnimated:NO];

Теперь у меня много AVAudioPlayers и AVAudioRecorder'ов, но я уверен, что перед тем, как выйти, все это тщательно обработаю. Странно то, что нажатие этой кнопки не всегда приводит к сбою приложения. Только после того, как прошло определенное количество времени, приложение зависает при нажатии. Поэтому, если я нажимаю кнопку через 2 секунды после загрузки страницы, я могу без проблем закрыть представление, и оно возвращается к другому виду. Однако, если я жду 9 или более секунд, я получаю сбой.

Я знаю, что невозможно помочь мне с этой маленькой информацией, но как мне начать отладку этой проблемы? Я не получаю никакого полезного вывода, когда он падает, просто BAD_ACCES и никаких сообщений вообще. Как я могу заглянуть глубже в это и узнать, что происходит? Отладчик тоже не помогает.

РЕДАКТИРОВАТЬ: Я не уверен, исправил ли я проблему, поскольку она случайная, но когда я впервые создаю контроллер представления, который я позже отклоню, я делаю это:

CloseDoorViewController *closeVC=[[CloseDoorViewController alloc] init];
[self.view addSubview:closeVC.view];
[self presentModalViewController:closeVC animated:NO];
[closeVC release];

Затем, когда я нахожусь в CloseDorView и нажимаю dismissModalViewController, у меня происходит сбой. Но после комментирования [closeVC release]; проблема исчезла (я думаю). Так я не должен выпускать closeVC? Как правильно это сделать?

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Я подозреваю, что здесь происходит то, что вы пытаетесь удалить контроллер модального вида из обработчика нажатия кнопки в фактическом коде контроллера модального представления.Вот что я всегда делаю при отображении модального контроллера вида:

В этом примере vc1 является «родительским» (я использую это свободно) контроллером представления, который будет представлять vc2.

(1).создать протокол («ModalViewControllerDelegate.h»):


//ModalViewControllerDelegate.h
@protocol ModalViewControllerDelegate 
-(void)viewControllerDidFinishShowing:(UIViewController*)controller;
@end

(2).отредактируйте vc1 примерно так:


//vc1.h:
#import "ModalViewControllerDelegate.h"
//...
@interface vc1 : UIViewController 
<ModalViewControllerDelegate>
{
//...
}

//vc1.m
#import "vc2.h"
//...
#pragma mark -
#pragma mark ModalViewControllerDelegate Methods
-(void)viewControllerDidFinishShowing:(UIViewController *)controller
{
    if(self.modalViewController == controller)
    {
        [self dismissModalViewControllerAnimated:YES];
    }
}
//...

(3).отредактируйте vc2 примерно так:


//vc2.h
#import "ModalViewControllerDelegate.h"
//...
@interface vc2 : UIViewController 
{
  id modalDelegate;
//...
}
//...
@property (nonatomic, assign) id modalDelegate;
- (IBAction)dismissButtonClicked:(id)sender;

//vc2.m
- (void)dealloc
{
//...
    self.delegate = nil;
//...
}
//...
- (IBAction)dismissButtonClicked:(id)sender
{
  if(self.modalDelegate)
   {
       if([self.modalDelegate respondsToSelector:@selector(viewControllerDidFinishShowing:)])
       {
           [self.modalDelegate viewControllerDidFinishShowing:self];
       }
   }
}

(4).представить vc2 из vc1 следующим образом:


//vc1.m
//...
vc2 *controller = [[vc2 alloc] initWithNibName:@"vc2" bundle:[NSBundle mainBundle]];
controller.modalDelegate = self;//very important
[self presentModalViewController:controller animated:YES];
[controller release];
//...

Объяснение: vc1 создает vc2 и устанавливает себя в качестве делегата для vc2 ... при нажатии кнопки dismiss в представлении vc2 он проверяет существованиеделегат, находит vc1, и соответствующий селектор / метод в vc1 срабатывает ... который отклоняет vc2.

Надеюсь, это поможет.

1 голос
/ 16 октября 2011

Просто используйте

[self dismissModalViewControllerAnimated:NO];

А не self.parentViewController

Если вы не используете ARC, вы уверены, что сохранили модальный View Controller, который вы отклоняете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...