2

Пусть говорят, у меня есть контроллеры представление с именем , B, C, D, E открыть эти ViewConrollers один за другим в presentModel пути. Когда я нахожусь в ViewControllerE Я хочу открыть другое ViewControllerF в настоящемМоделирование. В этом FViewController У меня есть кнопка возврата. Когда я нажимаю на это, он должен отклонить F и показать AViewController. Но теперь, когда он увольняет показывает E. Как я могу отклонить все другие viewcontrollers кроме А, когда я нажимаю кнопку назад из FКак отклонить viewcontroller внутри другого ViewController?

Пожалуйста, помогите мне. Благодаря

ОБНОВЛЕНО

-(IBAction)dismisthis:(id)sender{ 


UIViewController *dismissingViewController = self.presentingViewController; 
while (dismissingViewController.presentingViewController != nil && [dismissingViewController isKindOfClass:[FrontViewController class]]) { 
    dismissingViewController = self.presentingViewController; 
} 




[dismissingViewController dismissViewControllerAnimated:NO completion:NULL]; 

ответ

1

насчет отправки Notification с использованием NSNotificationCenter от F и А будет слушать его. Как только A получит уведомление, он назовет dismissViewController, который, я думаю, отклонит все.

+0

Это плохое решение. Уведомления должны использоваться, насколько это возможно, для указания произошедшего события, а не для инициирования конкретного действия. – Avi

+0

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

+0

«Для каждой сложной проблемы есть ответ, ясный, простой и. .. неправильно." - H.L. Mencken :-) – Avi

3

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

Если A всегда в нижней части кучи, вы можете использовать простой цикл, чтобы найти его:

UIViewController *dismissingViewController = self.presentingViewController; 
while (dismissingViewController.presentingViewController != nil) { 
    dismissingViewController = self.presentingViewController; 
} 

[dismissingViewController dismissViewControllerAnimated:YES 
              completion:NULL]; 
+0

Это работает, и я рекомендовал бы создать подкласс для контроллеров отображения так что вы можете убедиться, что вернетесь к тому, кого ожидаете, даже если позже он содержится в другом контроллере представления.Для этого вы можете просто изменить while() выше, чтобы проверить «rejectingViewController.presentingViewController! = Nil && [увольнениеViewController isKindOfClass: [MyAViewController class]]». Будущие итерации приложения могут представлять «A» с другого контроллера, и без этой проверки вы можете отклонить «A» по ошибке. – ekscrypto

+0

Но он говорит, что нет видимого интерфейса для rejectViewController – user1960169

+0

Я обновил мою кнопку-подсказку в моем вопросе – user1960169

1

На данный момент я могу думать о трех решений

  1. Вы должны держать отслеживать все viewControllers в stackObject (который является массивом) в Appdelegate. Когда вы хотите получить доступ к этому, получите этот массив и убейте все объектные элементы управления представлением.

  2. Каждый контроллер просмотра вы можете наблюдать за NSNotification, который будет прослушивать уведомление. Когда вам это нужно «F» просто опубликовать уведомление и это уведомление будет увольнять eviewcontrollers

  3. Go для NavigationController, так что вы можете нажать на RootViewController

0

Попробуйте это:

UIViewController *rootVC = [UIApplication sharedApplication].delegate.window.rootViewController; 
[rootVC dismissViewControllerAnimated:YES completion:nil]; 

// One-liner 
// [[UIApplication sharedApplication].delegate.window.rootViewController dismissViewControllerAnimated:YES completion:nil]; 
0

Сделайте, как RootViewController и использовать ниже код на кнопку Назад в «F»:

[[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissViewControllerAnimated:true completion:nil];