Как вручную установить «Назад» в приложениях iOS

У меня есть UIViewController, называемый «detailViewController».

Доступ к этому контроллеру просмотра осуществляется через несколько разных сегментов, используя push-сегмент.

Проблема, с которой я сталкиваюсь, заключается в том, что кнопка «Назад» на detailViewController возвращает пользователя назад к предыдущему контроллеру представления (как и должно быть), однако мне бы хотелось, чтобы кнопка «Назад» взяла пользователя в masterViewController (UIViewController по умолчанию в приложении) ,

Как мне это сделать?

Я попытался изменить типы segue, но на самом деле ничего не сделал.

Питер

    Метод, который вы ищете, – это popToRootViewControllerAnimated: UINavigationControllerAnimated popToRootViewControllerAnimated:

    Из документации : «Вставляет все контроллеры представления в стек, за исключением контроллера корневого представления и обновляет отображение».

    Вам нужно создать пользовательскую кнопку возврата. Вы не можете afaik переопределить функциональность кнопки «Назад».

    Итак, что-то вроде:

     UIButton *myBackButton = [UIButton buttonWithType:UIButtonTypeCustom]; [myBackButton addTarget:self action:@selector(popToRoot:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *myCustomBackButtonItem = [[UIBarButtonItem alloc] initWithCustomView:myBackButton]; [self.navigationItem setLeftBarButtonItem:myCustomBackButtonItem]; 

    а затем реализация popToRoot: будет выглядеть так:

     - (void)popToRoot:(id)sender { [self.navigationController popToRootViewControllerAnimated:YES]; } 

    Если masterViewController вы говорите, это root, который вы можете вызвать:

     [self.navigationController popToRootViewControllerAnimated:YES]; 

    Вы можете сами создать кнопку «Назад» и вызвать [self.navigationController popToRootViewControllerAnimated:YES] . Тем не менее, это требует, чтобы вы сами создали кнопку «Назад». Альтернативный вариант может состоять в том, чтобы взять текущий контроллер представления и удалить все из них, кроме первого и текущего:

     NSMutableArray *viewControllers = [self.navigationController.viewControllers mutableCopy]; [viewControllers removeObjectsInRange:NSRangeMake(1, [viewControllers count] - 2)]; self.navigationController.viewControllers = viewControllers; 

    Используйте следующий код, чтобы вернуться к главному контроллеру:

     [self.navigationController popViewControllerAnimated:YES]; 

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

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

     - (NSArray *)navigateToViewController:(NSString *)destinationControllerName withControllers:(NSArray *)sourceControllers { NSMutableArray *controllers = [[NSMutableArray alloc] initWithArray:sourceControllers]; NSInteger sourceControllerIndex = [controllers count] - 1; // Value should be index oriented instead of position oriented. NSInteger destControllerIndex = 0; // Find position of destination controller (index oriented) for (UIViewController *controller in controllers) { NSString *controllerName = NSStringFromClass([controller class]); NSLog(@"class name: %@", controllerName); if([[controllerName lowercaseString] isEqualToString:[destinationControllerName lowercaseString]]) break; destControllerIndex +=1; } // If desired controller does not exists in the stack, do not proceed. if (destControllerIndex == sourceControllerIndex) { return controllers; } // If destination is the same as source do not enter in this block // If destination and source controllers have zero or no controllers in between do not enter in this block // If destination and source controllers has few controllers (at least one) in between, go inside this block. // Here "destControllerIndex + 1" shows, there is at least one controller in between source and destination. else if(destControllerIndex + 1 < sourceControllerIndex) { NSLog(@"controllers in stack: %@", controllers); // Start from the controller following the source controller in stack and remove it // till the destination controller arrives for (NSInteger iterator = sourceControllerIndex - 1; iterator > destControllerIndex; iterator--) { UIViewController *cont = [controllers objectAtIndex:iterator]; if(cont) { [cont release]; cont = nil; } [controllers removeObjectAtIndex:iterator]; NSLog(@"controllers in stack: %@", controllers); } } return controllers; } 

    и определить его в каком-то базовом контроллере:

     -(void) popToViewController:(NSString *)controllerName withNavController:(UINavigationController *)navController { // STStatistics refers a singleton class of common functions. NSArray *mArr = [STStatistics navigateToViewController:controllerName withControllers:navController.viewControllers]; navController.viewControllers = mArr; // There should be more than one controller in stack to pop. if([mArr count] > 1) { [navController popViewControllerAnimated:YES]; } } 

    и вот как называется:

     [self popToViewController:@"NameOfDestinationControllerInNavStack" withControllers:self.navigationController]; 
    Interesting Posts

    Swift 2: NSData (contentsOfURL: url), возвращающий ноль

    Поверните GMSMarker в направлении, с которым пользователь сталкивается

    colorWithPatternImage vs CGImage vs UIImageView

    Альтернатива Singleton в Objective-C для лучшего дизайна приложения

    как заблокировать пользователя, если он / она не подключен к интернет-соединению при загрузке приложения

    iPhone UITextField – изменить цвет текста заполнителя

    Как я могу использовать AVPlayer с HTTPS и самозаверяющими сертификатами сервера?

    Адаптивная замена контроллеров View в ответ на изменения класса класса iOS 9

    NMSanagedObject's willSave не вызывается для недопустимого объекта

    Перезагрузка subview (UICollectionview)

    Как получить строку между слэшами -Swift

    Создание инструмента Magic Wand в приложении для редактирования фотографий? (точно так же, как приложение для фотошоп)

    как использовать sendAsynchronousRequest: queue: completeHandler:

    UIView, который имеет форму UIBezierPath?

    iPhone: использование Google для направления

    Давайте будем гением компьютера.