2015-11-13 3 views
11

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

navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true); 

Теперь я хочу, чтобы добавить навигационную панель в другой ViewController но моя навигационная панель не видна в этом ViewController. Почему это происходит?

Моя раскадровка, показывающая панель навигации, но как только я пытаюсь запустить свое приложение, оно исчезло.

Если я скрою панель навигации с одного контроллера вида, мы не сможем использовать контроллер навигации, не так ли? Надеюсь, я ошибаюсь. Тогда какие причины для навигационной панели не показаны?

EDIT:

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

extension UINavigationController{ 
    public override func shouldAutorotate() -> Bool { 
     if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft || 
      UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight || 
      UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) { 
       return false 
     } 
     else { 
      return true 
     } 
    } 

    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
     return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown] 
    } 


} 

Edit 1:

Я использую следующий код, чтобы перейти от одной из точек зрения контроллера не связывает с раскадровки. Это проблема?

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC") 
     presentViewController(secondViewController, animated: false, completion: nil) 

Edit 2:

Пожалуйста, проверьте мои следующие скриншоты. Какие мои настройки контроллера secondview

enter image description here

enter image description here

Edit 3:

Вот мой навигационный контроллер атрибут инспектор enter image description here

+0

вы устанавливаете весь стек контроллера навигации, чтобы он не отображался на контроллерах представлений, которые размещены на контроллере навигации. Если вам нужно отключить только определенные контроллеры, просто сделайте [self.navigationController setNavigationBarHidden: YES]; in viewDidLoad для контроллера вида –

ответ

22

Навигационный контроллер представляет собой контроллер, который имеет стек контроллеров. Так что если у вас есть что-то вроде этого:

СЧА -> A -> (Segue) B

Даже если вы скрыть панель навигации вы все равно должны быть в состоянии сделать перетекает. Также не можете ли вы просто отобразить навигационную панель во втором (B) контроллере просмотра в viewWillAppear? И сначала так же скрывать его на viewWillAppear.

редактировать: Окончательное решение проблемы: Использование:

let controller = storyboard.instantiateViewControllerWithIdentifier("HomeVC") 
self.navigationController!.pushViewController(controller) 

вместо:

let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC") 
presentViewController(secondViewController, animated: false, completion: nil) 

Поскольку pushViewController добавит secondViewController его стек. presentViewController заменил ваш навигационный контроллер, поэтому вы не могли видеть панель навигации.

+0

Так нет ли способа снова включить панель навигации? – Amsheer

+0

Зачем разрешать? Вы не отключите его в первую очередь. Вы просто скрываете это, как и любое другое обычное представление. Поэтому вы всегда можете его отобразить. – Makalele

+0

Но это не работает, это моя проблема. – Amsheer

2

в методе viewDidLoad контроллера вида, в котором вы не хотите, чтобы показать панель навигации добавьте строку

navigationController.navigationBarHidden = true 

вы в настоящее время скрывается во всех контроллерах зрения

Edit: Вы представляете вид контроллер вместо этого он должен быть

self.navigationController!.pushViewController(controller) 
+0

вы можете использовать конвертер Objc-Swift (https://objectivec2swift.com/#/converter/code) и отправить сообщение, ваш ответ будет более полезен – swiftBoy

+0

Пожалуйста, проверьте мое Редактировать 2: Я пропустил что-нибудь? – Amsheer

+0

Ваш второй контроллер представления не назначен классу, см. Снимок экрана. Он не отображает класс контроллера вида. А также вы представляете контроллер просмотра. вместо этого вам нужно нажать контроллер просмотра self.navigationController! .pushViewController (controller) –

7

сделать как в viewcontroller на основе скрытой

для шкуры navigationController в viewWillAppear

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.navigationBarHidden = true 
} 

для navigationController в Отобразить viewWillDisappear

override func viewWillDisappear(animated: Bool) 
{ 
    super.viewWillDisappear(animated) 
    self.navigationController?.navigationBarHidden = false 
} 
+0

Я пробовал, чтобы это не работало. Не могли бы вы проверить мой измененный вопрос. – Amsheer

+0

Пожалуйста, проверьте мое Редактирование 2: Я пропустил что-нибудь? – Amsheer

+0

@Amsheer - ваш вопрос верный –

1

Я имею же требование в моем быстром проекте.

это, как я обработал навигационную панель

Убедитесь, что ваш первый экран встроен в контроллер навигации

enter image description here

пример мы имеем два экрана A и B

В экран A вам необходимо скрыть навигационную панель в viewWillAppear

override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 

     //hide navigation for screen A 
     self.navigationController?.navigationBarHidden = true 
    } 

для обеспечения навигации в режиме B вам нужно добавить следующий код в экране

override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!) 
    { 
     if (segue.identifier == "screen B's segue identifier here") 
     { 
      //enable navigation for screen B  
      navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true) 
     } 

    } 

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

+0

Что такое kSEGUE_ID_MANAGE_ACCOUNT? – Amsheer

+0

это идентификатор segue для вашего следующего экрана – swiftBoy

+0

Я думаю, что я сделал что-то ужасно неправильно. Я заменяю этот «kSEGUE_ID_MANAGE_ACCOUNT» на «StoryBoard Id». Еще не повезло. – Amsheer

1

Если вам нужна эта панель навигации, скрытая только в этом контроллере, лучший способ - показать ее в viewWillDisappear() и спрятать в viewWillAppear().

+0

Я пробовал, как будто не работает. Пожалуйста, проверьте мое Редактирование 2: Я что-то пропустил? – Amsheer

+0

Спасибо, ваша логика правильная, но я ошибся в своем коде. – Amsheer

0

Слишком поздно отвечать, и есть другие хорошие ответы, но я хотел бы поделиться тем, что сработало для меня.

let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC") 
    self.navigationController!.pushViewController(controller!, animated:true) 
0

сделать как в viewcontroller на основе скрытой использованием Swift 4,0

Чтобы скрыть navigationController в viewWillAppear

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    self.navigationController?.isNavigationBarHidden = true 
} 

Чтобы показать navigationController в viewWillDisappear

override func viewWillDisappear(animated: Bool) 
{ 
    super.viewWillDisappear(animated) 
    self.navigationController?.isNavigationBarHidden = false 
}