presentModalViewController не работает должным образом - PullRequest
0 голосов
/ 12 июля 2010

У меня 3 просмотра.

Я хочу сделать следующее:

A presents B modally
A dismisses B
A presents C modally

Я настроил шаблон делегата, где A - делегат B. Вот как я представляю и отклоняю в B:

[delegate dismissB]; //this is just [self dismissModalViewControllerAnimated:NO]
[delegate presentC]; //this is just [self presentModalViewController:c animated:NO];

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

Когда я закомментирую [delegate presentC], приложение будет корректно отклонено. Когда я комментирую [delegate dismissB] приложение ничего не делает, даже если строка выполняется. Я не уверен, почему?

UPDATE: Вот код в

-(void)showARView{
    [self dismissModalViewControllerAnimated:NO];

    ARViewController* arViewController = [[[ARViewController alloc] initWithNibName:@"ARViewController" bundle:nil]autorelease];
    UINavigationController *arNavController = [[UINavigationController alloc] initWithRootViewController:arViewController];

    LeaderBoardTableViewController* lbViewController = [[[LeaderBoardTableViewController alloc] initWithNibName:@"LeaderBoardTableViewController" bundle:nil]autorelease];
    lbViewController.title = @"Leaderboard";    
    UINavigationController *lbNavController = [[UINavigationController alloc] initWithRootViewController:lbViewController];

    arTabBarController = [[UITabBarController alloc] init];//initWithNibName:nil bundle:nil];
    arTabBarController.delegate = self;
    arTabBarController.viewControllers = [NSArray arrayWithObjects:arNavController, lbNavController, nil];
    arTabBarController.selectedViewController = arNavController;

    [arNavController release];
    [lbNavController release];

    [self presentModalViewController:arTabBarController animated:NO];
}

Вот код в B

[delegate showARView];

1 Ответ

0 голосов
/ 12 июля 2010

Когда вы вызываете dismissB, делегат отклоняет view-контроллер.При нормальных обстоятельствах (если вы не сохраняете его в другом месте) это приводит к синхронному освобождению контроллера представления.И после этого вы пытаетесь получить доступ к переменной экземпляра делегата, но для этого в коде необходим разумный (скрытый) собственный указатель, который отменяется.Я не уверен, что NSZombie может помочь в этом случае.Вы можете легко выяснить, является ли это причиной вашего сбоя, вставив [[self retain] autorelease]; перед [delegate dismissB];.Однако это взлом, а не исправление.У вас проблема с дизайном.

Это не тот способ использования делегатов.B представляет некоторый пользовательский интерфейс и получает некоторое взаимодействие с пользователем.Затем он должен сообщить A, что произошло через сообщение делегата, например, bWasCanceled или bFinished.В вашем случае А обязан делегат решить, что делать дальше.Таким образом, в вашем случае делегат может решить отклонить B и вместо этого представить C. Или в коде:

// Inside A
- (void)controllerB:(UIViewController*)ctl didFinishWithResult:(id)something {
    [self dismissModalViewControllerAnimated:NO];
    // Instantiate and initialize c
    [self presentModalViewController:c animated:NO];
}

// Inside B
[delegate controllerB:self didFinishWithResult:@"OK"];

Если я полностью неверно истолковал ваш код, и все в порядке, у меня есть другое предложение.Я видел странные проблемы при отклонении и представлении модальных контроллеров представления в том же раунде цикла выполнения.Вы можете попробовать [delegate performSelector:@selector(presentC) withObject:nil afterDelay:0.0]; и посмотреть, поможет ли это.

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