2014-01-03 3 views
2

У меня есть некоторые статические ячейки, которые я хочу отобразить, поэтому у меня есть UITableViewController. В этой сцене также есть NavigationBar, который содержит несколько кнопок вверху. Установка выглядит следующим образом:UINavigationBar внутри UITableViewController

UITableViewController setup

Если бы я был UIViewController, который содержал UITableView в нем, установка будет выглядеть следующим образом:

UIViewController setup

Итак, вопрос:

  • Почему панель навигации должна быть встроена в UITableView при использовании UITableViewController? (Я пытался поставить его в другом месте, но IB не позволит мне)
  • Я знаю, что UITableView является подклассом UIView, но нормально ли, что элемент верхнего уровня в иерархии не является представлением (но TableView)?

Спасибо.

ответ

1

Есть два способа использования UINavigationBar в прошивкой:

  • Embedded внутри UINavigationController (рекомендуется)
  • как отдельный объект

Для вашей конкретной ситуации, я бы рекомендовал что вы положили UITableViewController в качестве rootViewControllerUINavigationController.Таким образом, вы автоматически получаете панель навигации, которую вы можете настроить в соответствии с вашими потребностями. В типичном пользовательском интерфейсе, когда вы нажимаете некоторые из ваших таблиц представления таблиц, новый диспетчер представлений будет перенесен в стек навигации, так что вы, вероятно, в конечном итоге нуждаетесь в контроллере навигации.

Что делать, если вы решили использовать панель навигации в качестве отдельного объекта? Это прекрасно, вы можете использовать его внутри иерархии представлений как обычный UIView, но вам нужно создать другой объект, который реализует протокол UINavigationBarDelegate, и установить его как свойство delegate вашей панели навигации. Если вы используете UINavigationController, делегат уже настроен и настроен для вас. Вам также необходимо добавить/удалить элементы навигации (экземпляры UINavigationItem) на панели навигации с помощью методов pushNavigationItem:animated: и popNavigationItemAnimated:.

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

1

Как работает UITableViewController, его корневым представлением является UITableView. Таким образом, нет возможности поместить UINavigationBar куда угодно, кроме UITableView.

Я, как правило, никогда не пользуюсь UITableViewController, так как это не дает вам многого.

Если вы особенно хотите использовать UITableViewController, я не верю, что существует какая-то реальная проблема с наличием панели навигации в представлении таблицы. Вам просто нужно убедиться, что вы установили contentInset в виде таблицы так, чтобы панель навигации не блокировала контент. Хотя это кажется немного отсталым, чтобы сделать это таким образом.

Моей рекомендацией было бы просто использовать обычный UIViewController с навигационной панелью и табличным представлением.

Если вам действительно нужна функциональная навигация, вам нужно установить UITableViewController в UINavigationController.

Надеется, что это помогает :)

Позволь мне знать, если что-то до сих пор неясно.

+0

Как правило, вы не хотели бы этого делать. Если вы хотите панель навигации, используйте UINavigationController, даже если вы не собираетесь нажимать дополнительные контроллеры. – Gavin

+0

Если вам не нужна навигация, и вы знаете, что никогда не захотите этого, я не вижу причин не делать этого таким образом. UINavigationController не даст вам ничего, кроме дополнительных причуд, которые входят в стандартную комплектацию с элементами UIKit: P –

+0

В каких чертах вы говорите? Почти всегда лучше использовать UINavigationController для включения UINavigationBar, если вы не планируете выполнять какую-то специальную настройку, которую UINavigationController не разрешает, что не отображается здесь. Кроме того, есть преимущества использования UITableViewController, а не UIViewController со встроенным UITableView, и для этого подхода потребуется использовать UINavigationController для правильного получения UINavigationBar. – Gavin

2

Вы не должны размещать UINavigationBar в своем UITableView. Вы должны положить свой UITableViewController в UINavigationController, потому что он предоставит вам UINavigationBar.

Так что, если вы выберете UITableViewController в раскадровке, вы можете выбрать Embed In -> Navigation Controller в меню Editor. Это был бы правильный способ сделать это.

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