Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Henrique DouradoОтветов: 2

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

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

            }
    }

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

  • Вы должны отфильтровать свои данные (массив и т. д.) и просто перезагрузить табличное представление. Sasha Kozachuk 12.03.2016

swiftuitableviewuisegmentedcontrolswift2

Ответы

Ответ 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....

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы