У меня есть UITableView, который в некоторых случаях может быть пустым. Поэтому вместо отображения фонового изображения приложения я бы предпочел напечатать на экране дружественное сообщение, например:
Этот список сейчас пуст
Как это сделать проще всего?
iphone
ios
uitableview
uiview
cateof
источник
источник
Ответы:
Свойство backgroundView UITableView - ваш друг.
В
viewDidLoad
или в любомreloadData
другом месте, где вы должны определить, является ли ваша таблица пустой или нет, и обновить свойство backgroundView UITableView с помощью UIView, содержащего UILabel, или просто установить его в nil. Вот и все.Конечно, можно заставить источник данных UITableView выполнять двойную функцию и возвращать специальную ячейку «список пуст», это кажется мне кладжем. Внезапно
numberOfRowsInSection:(NSInteger)section
приходится вычислять количество строк других разделов, о которых не спрашивали, чтобы убедиться, что они тоже пусты. Также нужно сделать специальную ячейку с пустым сообщением. Также не забывайте, что вам, вероятно, нужно изменить высоту вашей ячейки, чтобы разместить пустое сообщение. Все это выполнимо, но похоже на пластырь поверх пластыря.источник
backgroundView
скрытое свойство - это лучший способ. СDZNEmptyDataSet
, мы должны использовать егоemptyDataSetSource
tableView.backgroundView!.userInteraction = true
после строки, в которой вы установилиtableView.backgroundView = constructMyViewWithButtons()
, или как вы ее установили.То же, что и ответ Jhonston, но я предпочел его как расширение:
Использование:
источник
func numberOfSections(in tableView: UITableView) -> Int
методОсновываясь на ответах здесь, я подготовил небольшой урок, который вы можете использовать в своем
UITableViewController
.В вашем
UITableViewController
вы можете позвонить вnumberOfSectionsInTableView(tableView: UITableView) -> Int
С небольшой помощью http://www.appcoda.com/pull-to-refresh-uitableview-empty/
источник
viewController.tableView.separatorStyle = .none
не требуется.Я рекомендую следующую библиотеку: DZNEmptyDataSet
Самый простой способ добавить его в свой проект - использовать его с Cocaopods следующим образом:
pod 'DZNEmptyDataSet'
В свой TableViewController добавьте следующий оператор импорта (Swift):
Затем убедитесь, что ваш класс соответствует
DNZEmptyDataSetSource
иDZNEmptyDataSetDelegate
вот так:В ваших
viewDidLoad
добавьте следующие строки кода:Теперь все, что вам нужно сделать, чтобы показать пустое состояние:
Эти методы не являются обязательными, также можно просто показать пустое состояние без кнопки и т. Д.
Для Swift 4
источник
Один из способов сделать это - изменить источник данных, чтобы он возвращался,
1
когда количество строк равно нулю, и создавал ячейку специального назначения (возможно, с другим идентификатором ячейки) вtableView:cellForRowAtIndexPath:
методе.Это может быть несколько сложнее, если у вас есть несколько контроллеров табличного представления, которые вам нужно поддерживать, потому что кто-то в конечном итоге забудет вставить нулевую проверку. Лучшим подходом является создание отдельной реализации
UITableViewDataSource
реализации, которая всегда возвращает одну строку с настраиваемым сообщением (назовем егоEmptyTableViewDataSource
). Когда данные, которыми управляет ваш контроллер табличного представления, изменяются, код, управляющий изменением, проверяет, пусты ли данные. Если он не пустой, установите в контроллере табличного представления его обычный источник данных; в противном случае установите его с экземпляромEmptyTableViewDataSource
, который был настроен с соответствующим сообщением.источник
deleteRowsAtIndexPaths:withRowAnimation:
поскольку возвращаемое числоnumberOfRowsInSection
должно соответствовать результату $ numRows - $ rowsDeleted.Я использовал для этого сообщение titleForFooterInSection. Не знаю, неоптимально это или нет, но работает.
источник
return tableView.numberOfRowsInSection(section) == 0 ? "This list is now empty" : nil
Итак, для более безопасного решения:
и ,
UICollectionView
а также:Более универсальное решение:
источник
Я могу только рекомендовать перетаскивать UITextView внутри TableView после ячеек. Установите соединение с ViewController и при необходимости скройте / отобразите его (например, при перезагрузке таблицы).
источник
Использование backgroundView - это нормально, но не так хорошо, как в Mail.app.
Я сделал что-то похожее на то, что сделал xtravar .
Я добавил представление за пределами иерархии представлений
tableViewController
.Затем я использовал следующий код
tableView:numberOfRowsInSection:
:По сути, я добавил
emptyStateView
как частьtableView
объекта. Поскольку разделители будут перекрывать вид, я установил для них цветclearColor
. Чтобы вернуться к цвету разделителя по умолчанию, вы можете просто установить его наnil
.источник
tableHeaderView
и убедиться, что размер .По мнению Apple, использование Контроллера представления контейнера - правильный способ сделать это .
Я поместил все свои пустые представления состояния в отдельную раскадровку. У каждого есть собственный подкласс UIViewController. Я добавляю контент прямо под их корневое представление. Если требуется какое-либо действие / кнопка, теперь у вас уже есть контроллер для его обработки.
Затем остается лишь создать экземпляр желаемого контроллера представления из этой раскадровки, добавить его в качестве дочернего контроллера представления и добавить представление контейнера в иерархию tableView (подвид). Ваше пустое представление состояния также будет прокручиваемым, что приятно и позволит вам реализовать pull для обновления.
Прочтите главу «Добавление дочернего контроллера представления к вашему контенту», чтобы узнать, как его реализовать.
Просто убедитесь, что вы установили дочернюю рамку просмотра,
(0, 0, tableView.frame.width, tableView.frame.height)
и все будет правильно отцентрировано и выровнено.источник
Во-первых, проблемы с другими популярными подходами.
BackgroundView
Фоновый вид не будет хорошо центрирован, если вы использовали простой случай установки его как UILabel.
Ячейки, верхние или нижние колонтитулы для отображения сообщения
Это мешает вашему функциональному коду и вызывает странные крайние случаи. Если вы хотите идеально центрировать свое сообщение, это добавляет еще один уровень сложности.
Сворачивание собственного контроллера табличного представления
Вы теряете встроенную функциональность, такую как refreshControl, и заново изобретаете колесо. Придерживайтесь UITableViewController для достижения наилучших поддерживаемых результатов.
Добавление UITableViewController в качестве контроллера дочернего представления
У меня такое чувство, что в iOS 7+ вы столкнетесь с проблемами contentInset - плюс, зачем все усложнять?
Мое решение
Лучшее решение, которое я придумал (и, конечно, не идеально), - это создать специальный вид, который может располагаться поверх прокрутки и действовать соответственно. В iOS 7 это, очевидно, усложняется безумием contentInset, но это выполнимо.
На что следует обратить внимание:
Как только вы разобрались с этим один раз в одном подклассе UIView, вы можете использовать его для всего - загрузки счетчиков, отключения представлений, отображения сообщений об ошибках и т. Д.
источник
addSubView
его, прикрепленное к табличному представлению, что всегда создает проблемы с автоматическим макетом.Это лучшее и простое решение.
источник
Показать сообщение для пустого списка, используйте его UITableView или UICollectionView .
Обычаи:
ИЛИ:
Помните: не забудьте удалить метку сообщения, если данные появятся после обновления.
источник
Выберите сцену tableviewController в раскадровке
Перетащите метку UIView Add с вашим сообщением (например: Нет данных)
создайте выход UIView (скажем, например, yournoDataView) на вашем TableViewController.
и в viewDidLoad
self.tableView.backgroundView = yourNoDataView
источник
Использование Swift 4.2
источник
Вы можете добавить это в свой базовый класс.
Покажите это в классе по получению данных из api.
Спрячьте это вот так.
источник
Быстрая версия, но лучше и проще. ** 3,0
Я надеюсь, что он послужит вашей цели ......
В вашем UITableViewController.
Класс-помощник с функцией:
источник
Возможно, не самое лучшее решение, но я сделал это, просто поместив метку внизу моей таблицы, и если row = 0, я назначил ей какой-то текст. Довольно просто, и достигается то, что вы пытаетесь сделать, с помощью нескольких строк кода.
В моей таблице два раздела (вакансии и школы)
источник
Самый простой и быстрый способ сделать это - перетащить метку на боковую панель под tableView. Создайте выход для метки и tableView и добавьте оператор if, чтобы скрыть и отобразить метку и таблицу по мере необходимости. В качестве альтернативы вы можете добавить tableView.tableFooterView = UIView (frame: CGRect.zero) this для вас viewDidLoad (), чтобы дать пустой таблице ощущение, что она скрыта, если таблица и фоновое представление имеют одинаковый цвет.
источник
Я внес несколько изменений, чтобы нам не приходилось проверять счет вручную, а также добавил ограничения для метки, чтобы ничего не случилось, независимо от размера сообщения, как показано ниже:
использование
источник
Или, в качестве альтернативы, вы можете использовать немного настраиваемую легкую библиотеку
SwiftEmptyState
источник