отклонение modalViewController от modalViewController - PullRequest
1 голос
/ 16 сентября 2011

Итак, у меня есть приложение UITabBarController, и я хочу отобразить страницу входа, и я сделал:

 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(userDidLogin:) name:UserDidLoginNotification object:nil];
LoginViewController* loginViewController = [[LoginViewController alloc] init];
        self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:0];
        [self.tabBarController.selectedViewController presentModalViewController:loginViewController animated:NO];
        [loginViewController release];

Внутри моего LoginViewController я также могу показать другой modalViewController:

- (void) twitterLogin: (UIViewController *) askingView
{
    UIViewController *controller = [SA_OAuthTwitterController controllerToEnterCredentialsWithTwitterEngine: _twitter delegate: self];

    if (controller) {
        self.askingView = askingView;
        [askingView presentModalViewController: controller animated: YES];
    }
}

У меня есть следующий метод, где askView является LoginViewController, когда я хочу отклонить это, я делаю:

[self.askingView dismissModalViewControllerAnimated:YES];
    [[NSNotificationCenter defaultCenter] postNotificationName:UserDidLoginNotification object:nil];

Тем не менее, это не отменяет LoginViewController и не отображает представления UITabBarController ... он просто отклоняет мой modalViewController, показанный из LoginvVIewController. Что я здесь не так делаю? Я также получаю следующую ошибку:

attempt to dismiss modal view controller whose view does not currently appear. self = <LoginViewController: 0x2aff70> modalViewController = <SA_OAuthTwitterController: 0x2d2a80>
2011-09-16 09:45:37.750 VoteBooth[4614:707] attempt to dismiss modal view controller whose view does not currently appear. self = <MainViewController: 0x29fec0> modalViewController = <LoginViewController: 0x2aff70>

Ответы [ 3 ]

13 голосов
/ 16 сентября 2011

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

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES];
8 голосов
/ 26 октября 2011
if ([self respondsToSelector:@selector(presentingViewController)]) {
    [self.presentingViewController.presentingViewController dismissModalViewControllerAnimated:YES]; // for IOS 5+
} else {
    [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES]; // for pre IOS 5
}
2 голосов
/ 31 декабря 2012

Если у вас динамический пользовательский интерфейс и вы не знаете, к какому количеству родителей обратиться, вы можете использовать эту рекурсивную функцию, чтобы выяснить это ...

- (void) goHome
{
    //Dismiss modal back to home page
    int numberOfVcsToDismiss = [self findRootViewController:self];
    [self dismissToRootVc:numberOfVcsToDismiss];
}

- (int) findRootViewController:(UIViewController*)vc
{
    if(vc)
    {
        return 1 + [self findRootViewController:vc.presentingViewController];
    }
    return 0;
}

- (void) dismissToRootVc:(int)count
{
    if(count == 1)
        [self dismissViewControllerAnimated:YES completion:^{}];
    if(count == 2)
        [self.presentingViewController dismissViewControllerAnimated:YES completion:^{}];
    if(count == 3)
        [self.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{}];
    if(count == 4)
        [self.presentingViewController.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{}];
    if(count == 5)
        [self.presentingViewController.presentingViewController.presentingViewController.presentingViewController dismissViewControllerAnimated:YES completion:^{}];
    //etc....
}
...