Нажатие навигационного контроллера не поддерживается
В моем MainStoryBoard я хочу нажать viewController на detailView, но я получаю эту ошибку:
NSInvalidArgumentException ', причина: "Нажатие контроллера навигации не поддерживается"
Я установил идентификатор идентификатора JSA для viewController на раскадровке.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0) {
SWSJSAViewController *viewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"JSA"];
[self.navigationController pushViewController:viewController animated:YES];
}
}
Ответы
Ответ 1
Как rmaddy, в комментариях вы пытаетесь нажать навигационный контроллер.
Навигационные контроллеры должны быть представлены (через presentViewController или они могут быть добавлены как childViewController) и ViewControllers должны быть нажаты.
Ответ 2
Когда вы говорите о подталкивании навигации контроллера, то, скорее всего, что вы хотите, чтобы представить его.
- Представление UINavigationController
Это наиболее распространенный способ, и это то, что вы хотите сделать в большинстве случаев. UINavigationController
не может быть передан, он может быть представлен только с новым корневым View Controller.
MyViewController* vc = [[MyViewController alloc]
initWithNibName:@"MyController" bundle:nil];
UINavigationController *myNav = [[UINavigationController alloc] initWithRootViewController: vc];
[self presentViewController:myNav animated:YES completion:nil];
Здесь вы сначала создаете UINavigationController
а затем устанавливаете необходимый UIViewController
качестве своего корневого контроллера.
- Pushing UINavigationController
Если у вас есть иерархия ViewControllers и вам нужно нажать контроллер представления, который содержит контроллер навигации внутри, выполните следующие шаги:
1) Нажмите ViewController, содержащий UINavigationController
.
Чтобы нажать UINavigationController
, сначала создайте подкласс UIViewController
, который будет wrapper-/контейнер-класс для вашего UINavigationController
и его содержимого.
ContainerViewController* vc = [[ContainerViewController alloc] init];
2) Добавление UINavigationController в качестве дочернего контроллера представления
В viewDidLoad
вашего контейнера (который вы только что создали) просто добавьте что-то вроде этого:
Objective-C
UINavigationController* myNav = [[UINavigationController alloc] initWithRootViewController: rootViewController];
[myNav willMoveToParentViewController:self];
myNav.view.frame = self.view.frame; //Set a frame or constraints
[self.view addSubview:myNav.view];
[self addChildViewController: myNav];
[myNav didMoveToParentViewController:self];
Свифт 4. 2+
let childNavigation = UINavigationController(rootViewController: viewController)
childNavigation.willMove(toParent: self)
addChild(childNavigation)
childNavigation.view.frame = view.frame
view.addSubview(childNavigation.view)
childNavigation.didMove(toParent: self)
То, что вы делаете здесь, - это в основном создание экземпляра вашего контроллера навигации и добавление его в качестве дочернего контроллера в вашу оболочку. Это. Вы успешно выдвинули свой UINavigationController.