Как отфильтровать ячейки табличного представления с помощью UISegmentedControl в Swift?

Я уже искал это, прежде чем задать вопрос, но я не нашел то, что мне нужно.

Я создаю это приложение, в котором пользователь ставит задачу (не идя в магазин приложений, только для меня и некоторых друзей), и у задачи есть категория. Например: школа, дом, друзья и т. д. Когда пользователь собирается добавить новую задачу, есть 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" {

            }
    }

Я просто не знаю, куда идти отсюда. Как распознать и скрыть ячейки?


person Henrique Dourado    schedule 12.03.2016    source источник
comment
Вы должны отфильтровать свои данные (массив и т. д.) и просто перезагрузить табличное представление.   -  person Sasha Kozachuk    schedule 12.03.2016


Ответы (2)


Мне кажется, что вы можете сначала использовать более простой подход и заставить что-то работать. Настройте свой 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

person ryantxr    schedule 12.03.2016
comment
Я понял, что даже если это сработает, ячейки будут не в порядке, я бы просто изменил метку категории, а не метку задачи, например, чтобы можно было показывать задачу другой ячейки вместо своей. посмотрю, большое спасибо! - person Henrique Dourado; 12.03.2016

Это зависит от вашего представления таблицы.

Если вы используете NSFetchedResultsController, вам необходимо изменить запрос на выборку. Если вы используете массив напрямую, просто используйте функцию фильтра в Swift, передав условие, например. filteredArray = array.filter{$0.isAudioFile} Затем, после установки отфильтрованного массива источников данных, вызовите reloadData в табличном представлении.

Вам нужно будет сохранить ссылку на полный массив и использовать отфильтрованный в качестве источника данных в cellForRow....

person some_id    schedule 12.03.2016
comment
Как я могу использовать эту функцию .filter для фильтрации строки категории? Я пробовал category.filter(School), но выдает ошибку. Как им пользоваться и что такое броски? - person Henrique Dourado; 12.03.2016
comment
Итак, функция фильтра принимает запрос, вам нужно передать $0 для запрашиваемого объекта, а также свойство и условие. Например. someArray.filter{$0.category = Школа}. $0 представляет каждый объект в массиве, который будет проверяться на соответствие его категории школе. - person some_id; 12.03.2016
comment
Не работает :( Думаю придется отказаться от этой идеи. Может единственный выход - создавать разделы... - person Henrique Dourado; 12.03.2016