Я уже искал это, прежде чем задать вопрос, но я не нашел то, что мне нужно.
Я создаю это приложение, в котором пользователь ставит задачу (не идя в магазин приложений, только для меня и некоторых друзей), и у задачи есть категория. Например: школа, дом, друзья и т. д. Когда пользователь собирается добавить новую задачу, есть 2 текстовых поля, текстовое поле описания и текстовое поле категории. Я использую UIPickerView, поэтому пользователь выбирает категорию, а затем, после создания новой задачи, он добавит категорию в созданный мной массив под названием "категории".
Я хочу поместить UISegmentedControl поверх табличного представления с разделами:
Все - Школа - Дом - Друзья
Если выбрано все, будут показаны все ячейки без фильтрации. Если нет, он покажет ячейки с соответствующими категориями.
Я читал, что мне нужно создать разделы табличного представления для каждой категории, но это сильно изменит мой код, и я даже не представляю, как работать с несколькими разделами табличного представления, я пробовал один раз, но он продолжал повторять ячейки одного раздела во втором.
Итак, как я могу отфильтровать ячейки по категориям?
Могу ли я просто поставить, например, это? :
if //code to check in which section the picker is here {
if let schoolCell = cell.categories[indexPath.row] == "School" {
schoolCell.hidden = true
}
}
Помогите мне, пожалуйста!!!
РЕДАКТИРОВАТЬ:
У меня есть этот код сейчас:
if filterSegmentedControl.selectedSegmentIndex == 1 {
if categories[indexPath.row] == "School" {
}
}
Я просто не знаю, куда идти отсюда. Как распознать и скрыть ячейки?
Ответ 1 · рейтинг 2 · ryantxr
Мне кажется, что вы можете сначала использовать более простой подход и заставить что-то работать. Настройте свой ViewController и добавьте tableView и два (2) массива для данных вашей таблицы. Один будет для дома, а другой для работы. Да, я знаю, что это просто, но если вы заставите это работать, вы сможете развить это.
Добавьте переменную для отслеживания отображаемых данных.
@IBOutlet var segmentedControl: UISegmentedControl!
@IBOutlet var tableView: UITableView!
// You would set this to 0, 1 or 2 for home, work and all.
var dataFilter = 0
// Data for work tasks
var tableDataWork : [String] = ["Proposal", "Send mail", "Fix printer", "Send payroll", "Pay rent"]
// Data for home tasks
var tableDataHome : [String] = ["Car payment", "Mow lawn", "Carpet clean"]
Добавьте эти функции для сегментированного элемента управления.
@IBAction func segmentedControlAction(sender: AnyObject) {
switch segmentedControl.selectedSegmentIndex {
case 0:
print("Home")
dataFilter = 0
case 1:
print("Work")
dataFilter = 1
case 2:
print("All")
dataFilter = 2
default:
print("All")
dataFilter = 2
}
reload()
}
func reload() {
dispatch_async( dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("task-cell")
var title: String?
switch dataFilter {
case 0:
title = tableDataHome[indexPath.row]
case 1:
title = tableDataWork[indexPath.row]
case 2:
if indexPath.row < tableDataWork.count {
title = tableDataWork[indexPath.row]
} else {
title = tableDataHome[indexPath.row - tableDataWork.count]
}
default:
if indexPath.row < tableDataWork.count {
title = tableDataWork[indexPath.row]
} else {
title = tableDataHome[indexPath.row + tableDataWork.count]
}
}
cell?.textLabel?.text = title
if cell != nil {
return cell!
}
return UITableViewCell()
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// If
switch dataFilter {
case 0: return tableDataHome.count
case 1: return tableDataWork.count
default: return tableDataHome.count + tableDataWork.count
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1;
}
Весь проект можно найти здесь: https://github.com/ryantxr/segmented-control-app
Ответ 2 · рейтинг 1 · some_id
Это зависит от вашего представления таблицы.
Если вы используете NSFetchedResultsController, вам необходимо изменить запрос на выборку. Если вы используете массив напрямую, просто используйте функцию фильтра в Swift, передав условие, например. filteredArray = array.filter{$0.isAudioFile} Затем, после установки отфильтрованного массива источников данных, вызовите reloadData в табличном представлении.
Вам нужно будет сохранить ссылку на полный массив и использовать отфильтрованный в качестве источника данных в cellForRow....