[ios] iPhone은 첫 페이지에서만 탐색 모음을 숨 깁니다.

탐색 표시 줄을 숨기고 표시하는 코드가 아래에 있습니다. 첫 번째 뷰가로드되면 숨겨지고 “자식”이 호출 될 때 숨겨집니다. 문제는 루트보기로 돌아갈 때 다시 숨기도록 트리거하는 이벤트 / 작업을 찾을 수 없다는 것입니다.

루트 페이지에 수동으로 작업을 수행하는 “테스트”버튼이 있지만 예쁘지 않고 자동으로 작동하기를 원합니다.

-(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;

및 사용 setNavigationBarHiddennavigationController: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것이 좋으며 여기에 더 완벽한 솔루션이 있습니다. 단계 :

  1. 아강 UINavigationController
  2. -navigationController:willShowViewController:animated루트보기 컨트롤러를 표시하는지 여부에 따라 탐색 표시 줄을 표시하거나 숨기는 방법을 구현하십시오.
  3. 초기화 메소드를 대체하여 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 버전은 다음과 같습니다.

  1. 새 파일 만들기 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)
        }
    }

}
  1. StoryBoard에서 UINavigationController의 클래스를 MyNavigationController로 설정하십시오
    .MyNavigationController

chad-m의 답변과 내 차이점의 차이점 :

  1. UINavigationController에서 상속되므로 rootViewController를 오염시키지 않습니다.

  2. 사용 self.viewControllers.first하기보다는 homeViewController당신이 1 스토리 보드에 100 UINavigationControllers이 100 번을하지 않도록.