2016-01-28 5 views
4

У меня есть UIViewController с навигационной панели HIDDEN, пару кнопок вверх Верхним и UITableView с UISearchController в качестве заголовка. Вот вопрос: когда я создаю UISearchController, у меня есть эта строка:IOS - UISearchController - definesPresentationContext вопрос макет

self.definesPresentationContext = YES; 

Теперь то, что происходит в том, что при поиске с помощью UISearchController, и нажать на одну из результатов в UITableView, он открывает мой следующий UIViewController (это именно то, что он должен делать, - и следующее UIViewController также верно скрывает навигационную панель), но отображает сероватую навигационную панель вверху UIViewController, хотя я устанавливаю навигационную панель как скрытый.

Теперь, когда я установил:

self.definesPresentationContext = NO; 

панель навигации не отображается в следующем виде, но вместо этого, UISearchController's SearchBar появится в следующем UIViewController на том же месте, как это было в основном контроллере представления , хотя это, очевидно, не должно быть там больше.

Это то, что он должен выглядеть (вверху UIViewController): enter image description here

Это то, что происходит, когда `self.definesPresentationContext = YES;

enter image description here

И это то, что происходит, когда `self.definesPresentationContext = NO;

enter image description here

Как я могу вернуться к ситуации номер один? UPDATE Вот пример проекта, который дублирует этот вопрос: http://www.filedropper.com/sampleprojectbugreport

+0

Я думаю, что это ошибка Apple. Я сообщил об этом. Они попросили меня предоставить образец проекта, который я предоставил. –

+0

Как вы сказали: «« Следующий UIViewController также имеет скрытую навигационную панель », но он отображает сероватую панель навигации в верхней части UIViewController, хотя я настраиваю панель навигации как скрытую« ... какой код вы написали, чтобы скрыть навигацию и где вы разместили that.ie на каком методе. – Vizllx

+0

Где вы определяете self.definesPresentationContext = YES? во втором контроллере просмотра? как вы представляете контроллер 2-го вида через segue или навигация или по модулю? для этого нужен код. – Vizllx

ответ

2

Это выглядит как ошибка в IOS. Если вы не планируете показывать панель навигации на всех, вы можете создать подкласс UINavigationController и переопределить метод -setNavigationBarHidden:animated: и жестко кодовой hidden значения:

-(void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated { 
    [super setNavigationBarHidden:YES animated:animated]; 
} 

Я проверил это временное решение, и это мешает панель навигации от показа.

См обновленный образец проекта: http://appsandwich.com/stackoverflow/navcontrollersubclass.zip

+0

Извините за глупый вопрос, но как я могу подклассифицировать UINavigationController? Спасибо за ответ! –

+0

В Xcode, File -> New -> File ... В разделе iOS Source выберите Cocoa Touch Class. Затем введите UINavigationController в поле подкласса. –

+0

Я обновлю пример проекта и приложим к моему ответу. –

0

У меня такая же проблема. Я решил это с помощью KVO. Я выясняю в видуWillAppear (_ :), navigationBar's isHidden это правда. Но в viewDidAppear (_ :), navigationBar's isHidden изменен на false. Я не знаю, что произошло. Но я думаю, что смогу захватить и изменить его с помощью KVO.

первым, добавьте наблюдатель в viewWillAppear (_ :)

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    navigationController?.navigationBar.addObserver(self, forKeyPath: "hidden", options: [.new], context: nil) 
} 

затем измените Панель навигации в isHidden-х observerValue()

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    guard let keyPath = keyPath else { return }  
    if keyPath == "hidden" { 
     // you should remove the KVO before set 
     navigationController?.navigationBar.removeObserver(self, forKeyPath: "hidden") 
     navigationController?.navigationBar.isHidden = true 
    } else { 
     super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) 
    } 
} 

теперь Панель навигации скрыта, как и ожидалось. надеюсь, что это поможет.

Смежные вопросы