탐색 표시 줄을 숨기고 표시하는 코드가 아래에 있습니다. 첫 번째 뷰가로드되면 숨겨지고 “자식”이 호출 될 때 숨겨집니다. 문제는 루트보기로 돌아갈 때 다시 숨기도록 트리거하는 이벤트 / 작업을 찾을 수 없다는 것입니다.
루트 페이지에 수동으로 작업을 수행하는 “테스트”버튼이 있지만 예쁘지 않고 자동으로 작동하기를 원합니다.
-(void)hideBar
{
self.navController.navigationBarHidden = YES;
}
-(void)showBar
{
self.navController.navigationBarHidden = NO;
}
답변
내가 찾은 가장 좋은 해결책은 첫 번째 뷰 컨트롤러 에서 다음을 수행하는 것 입니다.
목표 -C
- (void)viewWillAppear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:YES animated:animated];
[super viewWillAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated {
[self.navigationController setNavigationBarHidden:NO animated:animated];
[super viewWillDisappear:animated];
}
빠른
override func viewWillAppear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(true, animated: animated)
super.viewWillAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
self.navigationController?.setNavigationBarHidden(false, animated: animated)
super.viewWillDisappear(animated)
}
이렇게하면 UIViewController
스택 에서 다음 을 누를 때 탐색 모음이 왼쪽에서 (다음보기와 함께) 애니메이션되고 왼쪽에서 뒤로 (오래된보기와 함께) 애니메이션이 나타납니다. UINavigationBar
.
이것들은 델리게이트 메소드가 아니며, UIViewController
이러한 메소드의 구현을 재정의 하고 있으며 문서에 따르면 구현의 어딘가에서 super의 구현을 호출해야합니다 .
답변
내가 찾은 또 다른 접근법은 다음에 대한 대리자를 설정하는 것입니다 NavigationController
.
navigationController.delegate = self;
및 사용 setNavigationBarHidden
에navigationController:willShowViewController:animated:
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
// Hide the nav bar if going home.
BOOL hide = viewController != homeViewController;
[navigationController setNavigationBarHidden:hide animated:animated];
}
ViewController
한 곳에서 각각의 동작을 쉽게 사용자 지정할 수 있습니다 .
답변
다른 답변에서 한 가지 약간의 조정은 viewWillDisappear에서 막대를 숨기기 해제하는 것입니다. 다른 이유로보기가 사라질 수 있기 때문입니다.
따라서이보기가 더 이상 최상위보기가 아닌 경우 막대를 숨기기 해제하십시오.
- (void) viewWillDisappear:(BOOL)animated
{
if (self.navigationController.topViewController != self)
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
[super viewWillDisappear:animated];
}
답변
표시되는 각 뷰 의 viewWillAppear 델리게이트에 코드를 추가합니다 .
숨길 필요가있는 곳에서 이렇게 :
- (void)viewWillAppear:(BOOL)animated
{
[yourObject hideBar];
}
이것을 보여줘야 할 곳과 같이 :
- (void)viewWillAppear:(BOOL)animated
{
[yourObject showBar];
}
답변
현재 승인 된 답변이 질문에 설명 된 의도 된 행동과 일치하지 않습니다. 이 질문은 탐색 표시 줄을 루트보기 컨트롤러에서 숨길 것을 요구하지만 다른 곳에서는 볼 수 있지만 허용 된 답변은 특정보기 컨트롤러의 탐색 모음을 숨 깁니다. 첫 번째 뷰 컨트롤러의 다른 인스턴스를 스택에 푸시하면 어떻게됩니까? 루트 뷰 컨트롤러를 보지 않아도 탐색 모음이 숨겨집니다.
대신 @Chad M.의 전략 을 사용하는 UINavigationControllerDelegate
것이 좋으며 여기에 더 완벽한 솔루션이 있습니다. 단계 :
- 아강
UINavigationController
-navigationController:willShowViewController:animated
루트보기 컨트롤러를 표시하는지 여부에 따라 탐색 표시 줄을 표시하거나 숨기는 방법을 구현하십시오.- 초기화 메소드를 대체하여 UINavigationController 서브 클래스를 자체 대리자로 설정하십시오.
이 솔루션에 대한 전체 코드는 이 요지 에서 찾을 수 있습니다 . navigationController:willShowViewController:animated
구현 은 다음과 같습니다 .
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
/* Hide navigation bar if root controller */
if ([viewController isEqual:[self.viewControllers firstObject]]) {
[self setNavigationBarHidden:YES animated:animated];
} else {
[self setNavigationBarHidden:NO animated:animated];
}
}
답변
스위프트 3에서 :
override func viewWillAppear(_ animated: Bool) {
navigationController?.navigationBar.isHidden = true
super.viewWillAppear(animated)
}
override func viewWillDisappear(_ animated: Bool) {
if (navigationController?.topViewController != self) {
navigationController?.navigationBar.isHidden = false
}
super.viewWillDisappear(animated)
}
답변
@ chad-m의 대답에 내 신용을 줘.
Swift 버전은 다음과 같습니다.
- 새 파일 만들기
MyNavigationController.swift
import UIKit
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.delegate = self
}
func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
if viewController == self.viewControllers.first {
self.setNavigationBarHidden(true, animated: animated)
} else {
self.setNavigationBarHidden(false, animated: animated)
}
}
}
chad-m의 답변과 내 차이점의 차이점 :
-
UINavigationController에서 상속되므로 rootViewController를 오염시키지 않습니다.
-
사용
self.viewControllers.first
하기보다는homeViewController
당신이 1 스토리 보드에 100 UINavigationControllers이 100 번을하지 않도록.