Как отфильтровать все разделы из UITableView, чтобы получить нужные элементы - PullRequest
0 голосов
/ 13 июня 2019

У меня есть UITableView, заполненный массивом объектов (каждый объект является разделом).В этом массиве объектов каждый объект имеет несколько элементов (вопросы с описанием и другими свойствами).На данный момент я скрываю от своих UITableView все ненужные вопросы.Но эта практика не подходит, поэтому я хочу провести рефакторинг и отфильтровать свои вопросы, чтобы получить только необходимые вопросы из каждого раздела.Поэтому я хочу иметь массив с разделами, где для каждого раздела элементы были отфильтрованы.Требование:

item.showTrailer == false && item.showVehicle == true.

Вот мой код:

// MARK: MODEL
class ChecklistItemSection {

    var name: String // name of the section
    var checklistItems: [ChecklistItem] // all items from Checklist

    init(named: String, checklistItems: [ChecklistItem]) {

        self.name = named
        self.checklistItems = checklistItems
    }

    class func checklistItemSections() -> [ChecklistItemSection] {

        var allSections = [vehicleCheck(), viewingScreen() ]

        for (index, section) in allSections.enumerated() {
            if(section.checklistItems.count < 1) {
                allSections.remove(at: index)
            }
        }
        return allSections
    }

    // Private methods
    private class func vehicleCheck() -> ChecklistItemSection {

        var checklistItems = [ChecklistItem]()

        checklistItems.append(ChecklistItem(templateID: 109, lineID: 3, poolID: 10, descript: "Tyres - Wear/Damage/Bulges/Cuts/Flat tyres", showVehicle: false, showTrailer: true, highlight: false, pg9: false, imagesPath: [])!)
        checklistItems.append(ChecklistItem(templateID: 109, lineID: 4, poolID: 22, descript: "Vehicle and trailer coupling: undamaged and safety locking device working", showVehicle: true, showTrailer: false, highlight: true, pg9: true, imagesPath: [])!)
        checklistItems.append(ChecklistItem(templateID: 109, lineID: 7, poolID: 20, descript: "Exhaust - Condition/Emission (Excess smoke)", showVehicle: true, showTrailer: false, highlight: false, pg9: false, imagesPath: [])!)
        checklistItems.append(ChecklistItem(templateID: 109, lineID: 3, poolID: 10, descript: "Tyres - Wear/Damage/Bulges/Cuts/Flat tyres", showVehicle: true, showTrailer: false, highlight: false, pg9: false, imagesPath: [])!)
        checklistItems.append(ChecklistItem(templateID: 109, lineID: 4, poolID: 22, descript: "Vehicle and trailer coupling: undamaged and safety locking device working", showVehicle: true, showTrailer: true, highlight: true, pg9: true, imagesPath: [])!)
        checklistItems.append(ChecklistItem(templateID: 109, lineID: 7, poolID: 20, descript: "Exhaust - Condition/Emission (Excess smoke)", showVehicle: false, showTrailer: true, highlight: false, pg9: false, imagesPath: [])!)

        return ChecklistItemSection(named: "Section 1", checklistItems: checklistItems)
    }

    private class func viewingScreen() -> ChecklistItemSection {

        var checklistItems = [ChecklistItem]()

        checklistItems.append(ChecklistItem(templateID: 38, lineID: 28, poolID: 16, descript: "Windscreen Wipers & Washers are they effective?", showVehicle: true, showTrailer: false, highlight: false, pg9: false, imagesPath: [])!)

        checklistItems.append(ChecklistItem(templateID: 38, lineID: 28, poolID: 16, descript: "Water Level - In cab indicator", showVehicle: true, showTrailer: false, highlight: false, pg9: false, imagesPath: [])!)

        return ChecklistItemSection(named: "Section 2", checklistItems: checklistItems)
    }
}

class ChecklistItem{

    var showVehicle: Bool
    var showTrailer: Bool
}


// MARK: VC
class ChecklistViewController: UIViewController {

    lazy var checklistItem: [ChecklistItemSection] = { return ChecklistItemSection.checklistItemSections() }()

    var filteredQuestions: [ChecklistItemSection] = []

    override func viewDidLoad() {
        super.viewDidLoad()

        filteredQuestions = All sections where the questions have showVehicle == true && showTrailer == false
    }
}

Спасибо, что прочитали это.

Ответы [ 3 ]

1 голос
/ 13 июня 2019

Вы можете попробовать

filteredQuestions = checklistItem.filter { $0.checklistItems.filter { !$0.showTrailer && $0.showVehicle }.count != 0  }

Редактировать:

checklistItem.forEach {
    $0.checklistItems.forEach {
        if $0.showTrailer {
            $0.showTrailer = false
        }
    }
}
0 голосов
/ 13 июня 2019

Вам необходимо воссоздать ваши разделы с фильтрованием их контрольного списка.

filteredQuestions = 
   checklistItem.map { ChecklistItemSection(named: $0.name, 
                                   checklistItems: $0.checklistItems.filter { $0.showVehicle 
                                                                        && !$0.showTrailer }) 
                     }
                // Add the next line if you want to remove sections without questions
                // .filter { $0.checkListItems.count > 0 } 
0 голосов
/ 13 июня 2019

Вы можете отфильтровать ваш массив, используя следующее:

Вы получите фильтрованные вопросы для каждого CheckListItem.

override func viewDidLoad() {
            super.viewDidLoad()

            for item in checklistItem {
                filteredQuestions = item.filter{ $0.showTrailer == false && $0.showVehicle == true }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...