переход между контроллерами представления с контроллером навигации

Допустим, у меня есть ViewController A с двумя кнопками, каждая из которых переходит к ViewController B и C (одна кнопка к View B, а другая к C). От ViewController CI переходит к ViewController D. Все ViewControllers имеют панель навигации, поэтому из представления B я может вернуться к A, а из вида D я могу вернуться к D->C->A. Проблема заключается в том, что когда я переключаюсь между представлением D и B: переход выполняется, но теперь на панели навигации B я перенастроился на представление D, и я хочу, чтобы B вернулся к A, как и должно. Каково решение????


person liron    schedule 11.03.2014    source источник


Ответы (1)


Насколько мне известно, это можно сделать двумя способами.

1) Используйте пользовательскую кнопку «Назад» на D-контроллере.

2) Измените стек navigationController, т.е. NSArray из self.navigationController.viewControllers в классе D-контроллера.

Использовать пользовательскую кнопку "Назад"

Вы можете сделать это следующим образом в контроллере D. Это действительно только в том случае, если контроллер является rootViewController для navigationController. Если вы отслеживаете свой контроллер A, вы также можете использовать следующее

  • (NSArray *)popToViewController:(UIViewController )viewController анимированный:(BOOL)анимированный

    - (void)viewDidLoad
    {
    [super viewDidLoad];
     UIBarButtonItem *backButton = [[UIBarButtonItem alloc]  initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(goBack:)];
     self.navigationItem.leftBarButtonItem = backButton;
      self.navigationItem.hidesBackButton = YES;
    }
    
    -(void)goBack:(id)sender
    {
    [self.navigationController popToRootViewControllerAnimated:YES];
    

    }

Изменить стек navigationController

Это полезно, если вы хотите перейти к определенному контроллеру. Но кнопка «Назад» по-прежнему отображается после возврата к контроллеру A из B, что вам, возможно, придется увидеть самостоятельно, внеся некоторые изменения. Не пытайтесь изменить стек навигации в prepareForSegue

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
    NSMutableSet *controllersToRemove = [NSMutableSet new];
        for (id viewController in controllers) {
            if (![viewController isKindOfClass:[self class]]&&![viewController isKindOfClass:[NRViewController class]]) {
                    [controllersToRemove addObject:viewController];
                }
        }

        for (id controller in controllersToRemove) {
            [controllers removeObject:controller];
        }
    self.navigationController.viewControllers = controllers;
}

Отредактированный код для пользовательской кнопки "Назад"

Если вы хотите оригинальную кнопку возврата

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

UIButton *backButton = [[UIButton alloc] initWithFrame: CGRectMake(0, 0, 60.0f, 30.0f)];
    UIImage *backImage = [[UIImage imageNamed:@"back_button_normal.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 12.0f, 0, 12.0f)];
    [backButton setBackgroundImage:backImage  forState:UIControlStateNormal];
    [backButton setTitle:@"Back" forState:UIControlStateNormal];
    [backButton addTarget:self action:@selector(goBack:) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    self.navigationItem.leftBarButtonItem = backButtonItem;
person nick28    schedule 11.03.2014
comment
он отлично работает, если я написал первый код в B viewController (в viewDidLoad), но мне нужна оригинальная кнопка стрелки возврата, а не кнопка DONE - person liron; 12.03.2014
comment
В этом случае вы должны использовать изображение для кнопки «Назад». - person nick28; 12.03.2014