Как отклонить два или более dismissModalViewController? - PullRequest
5 голосов
/ 25 ноября 2010

Мне нужно отклонить два контроллера модального представления, я знаю, как открыть два или более контроллеров представления

        UINavigationController* navController = self.navigationController;
    NSArray *array=[navController viewControllers];
    UIViewController* controller = [navController.viewControllers objectAtIndex:0];
    [navController popToViiewController:controller animated:YES];

Вот как я могу вернуться к своему первому виду, но если есть два или болееотклонить модальное представление, тогда как мне вернуться назад

, пожалуйста, помогите мне, спасибо, Мадан Мохан

Ответы [ 5 ]

5 голосов
/ 29 ноября 2010

Из документов на -[UIViewController dismissModalViewController]:

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

4 голосов
/ 18 октября 2012

Используйте этот код ниже

[[[self presentingViewController] presentingViewController]  dismissModalViewControllerAnimated:YES];
3 голосов
/ 01 июня 2011

Я использую следующую утилиту статический метод для имитации popToRootViewController для стека модалов:

// Util.m
+ (void)popModalsToRootFrom:(UIViewController*)aVc {
    if(aVc.parentViewController == nil) {
        return;
    }
    else {
        [Util popModalsToRootFrom:aVc.parentViewController];  // recursive call to this method
        [aVc.parentViewController dismissModalViewControllerAnimated:NO];
    }
}

Вы используете это так:

[Util popModalsToRootFrom:aViewController];

Если вы хотите что-то более продвинутое, вы можете сделать это:

+ (void)popModalsFrom:(UIViewController*)aVc popCount:(int)count {
    if(aVc.parentViewController == nil || count == 0) {
        return;
    }
    else {
        [Util popModalsFrom:aVc.parentViewController popCount:count-1];  // recursive call to this method
        [aVc.parentViewController dismissModalViewControllerAnimated:NO];
    }
}

Затем передайте количество модалов в pop или просто -1, чтобы выдвинуться до корня.

2 голосов
/ 01 декабря 2010
UINavigationController* navController = self.navigationController;
NSArray *viewControllers=[navController viewControllers];
UIViewController* controller = [viewControllers objectAtIndex:0];
[navController popToViewController:controller animated:YES];

, если вы установите объект с индексом 0 в приведенном выше коде, он приведет вас к первому представлению, которое является контроллером push-просмотра.

1) Rootview ---> moodalview1 --->moodalview2 ---> moodalview3, если вы используете приведенный выше код, то вы будете в режиме просмотра root.

2) Rootview ---> Pushview1 ----> moodalview1 ---> moodalview2 ----->moodalview3.если вы используете приведенный выше код, вы будете в PushView.

1 голос
/ 17 сентября 2012

Для iOS 5, поддержка animation == YES (представления будут последовательно скрываться) и completion block:

+ (void)dismissAllVCsForVC:(UIViewController *)VC animated:(BOOL)animated completion:(BPSimpleBlock)completion {
    if (VC.presentedViewController == nil) {
        if (completion) {
            completion();
        }
    } else {
        [BaseViewController dismissAllVCsForVC:VC.presentedViewController
                                        animated:animated
                                      completion:
         ^{
             [VC dismissViewControllerAnimated:animated completion:completion];
         }];
     }
}
...