Принудительно перезагрузить данные UIPickerView - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть UITableViewController с 2 динамическими c ячейками (одна для ячейки с деталями и одна для UIPickerView). Программно я создаю 2 раздела с 1 строкой (1 раздел) и 2 рядами (2 раздела). Ряды открываются UIPickerView при нажатии на них. Но у меня есть небольшая проблема. Я не знаю, как заставить UIPickerView перезагрузить / обновить и показать необходимые данные. UIPickerView загрузить только массив ячеек, которые я открываю первым. Если я открою другую ячейку (с другим массивом), UIPickerView не перезагружает данные. Я пытался поставить reloadAllComponents() где угодно, но ничего не происходит. Ты хоть представляешь, как я могу это исправить? Спасибо

enter image description here

    import Foundation
    import UIKit

    class VC: UITableViewController, UIPickerViewDataSource, UIPickerViewDelegate {

    var units = ["A","B","C","D","E","F","G"]

    var units2 = ["1","2","3","4","5","6","7"]

    var units3 = ["I","II","III","IV","V","VI","VII"]

    // Show or hide picker
    var showUnitsPickerView = false
    var showUnits2PickerView = false
    var showUnits3PickerView = false

    var pickerView = UIPickerView()

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        var count = 0

        if showUnitsPickerView {
            count = units.count
        } else if showUnits2PickerView {
            count = units2.count
        } else {
            count = units3.count
        }

        return count

    }

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        var value = ""

        if showUnitsPickerView {
            value = String(units[row])
        } else if showUnits2PickerView {
            value = String(units2[row])
        } else if showUnits3PickerView {
            value = String(units3[row])
        }

        return value

    }

    // MARK: - View Did Load
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        var count = 1

        switch section {

        case 0:
            if showUnitsPickerView {
                count = 2
            }

        case 1:
            if showUnits3PickerView
            || showUnits2PickerView {
                count = 3
            } else {
                count = 2
            }
        default:
            count = 1
        }

        return count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        switch indexPath.section {
        case 0:

            var universallCell = UITableViewCell()

            if indexPath.row == 0 {

                let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TitleAndDetailCellT3.self), for: indexPath) as! TitleAndDetailCellT3

                cell.title.text = "Picker 1"
                cell.detail.text = "A"
                universallCell = cell

            } else if showUnitsPickerView {

                let cellWithPickerView = tableView.dequeueReusableCell(withIdentifier: String(describing: PickerViewCellT3.self), for: indexPath) as! PickerViewCellT3
                cellWithPickerView.pickerView.delegate = self
                cellWithPickerView.pickerView.dataSource = self
                cellWithPickerView.pickerView = pickerView

                universallCell = cellWithPickerView

            }

            return universallCell

        case 1:

            var universallCell = UITableViewCell()

            let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: TitleAndDetailCellT3.self), for: indexPath) as! TitleAndDetailCellT3

            let cellWithPickerView = tableView.dequeueReusableCell(withIdentifier: String(describing: PickerViewCellT3.self), for: indexPath) as! PickerViewCellT3

            switch indexPath.row {
            case 0:
                cell.title.text = "Picker 2"
                cell.detail.text = "1"
                universallCell = cell
            case 1:

                if showUnits2PickerView {
                    cellWithPickerView.pickerView.delegate = self
                    cellWithPickerView.pickerView.dataSource = self

                    cellWithPickerView.pickerView = pickerView
                    universallCell = cellWithPickerView
                } else {
                    cell.title.text = "Picker 3"
                    cell.detail.text = "I"
                    universallCell = cell
                }

            case 2:

                if showUnits2PickerView {
                    cell.title.text = "Picker 3"
                    cell.detail.text = "I"
                    universallCell = cell
                } else if showUnits3PickerView {

                    cellWithPickerView.pickerView.delegate = self
                    cellWithPickerView.pickerView.dataSource = self

                    cellWithPickerView.pickerView.reloadAllComponents()
                    cellWithPickerView.pickerView = pickerView

                    universallCell = cellWithPickerView
                }



            default:
                break
            }

            return universallCell

        default:
            let universallCell = UITableViewCell()
            return universallCell
        }

        // Configure the cell...

        //return universallCell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


        struct RowName {

            var units = 0
            var units2 = 1
            var units3 = 2

        }

        // Hide row
        func hideRow(rowName: Int) {

            switch rowName {
            case RowName().units:
                if showUnitsPickerView {
                    showUnitsPickerView = false
                    tableView.beginUpdates()
                    tableView.deleteRows(at: [
                        (NSIndexPath(row: 1, section: 0) as IndexPath)], with: .automatic)
                    tableView.endUpdates()
                }

            case RowName().units2:

                if showUnits2PickerView {
                    showUnits2PickerView = false
                    tableView.beginUpdates()
                    tableView.deleteRows(at: [
                        (NSIndexPath(row: 1, section: 1) as IndexPath)], with: .automatic)
                    tableView.endUpdates()
                }

            case RowName().units3:

                if showUnits3PickerView {
                    showUnits3PickerView = false
                    tableView.beginUpdates()
                    tableView.deleteRows(at: [
                        (NSIndexPath(row: 2, section: 1) as IndexPath)], with: .automatic)
                    tableView.endUpdates()
                }

            default:
                break
            }

        }

        switch indexPath.section {
        case 0:

            hideRow(rowName: RowName().units2)
            hideRow(rowName: RowName().units3)

            showUnitsPickerView = showUnitsPickerView ? false : true

            if showUnitsPickerView {

                tableView.deselectRow(at: indexPath, animated: true)

                tableView.beginUpdates()
                tableView.insertRows(at: [
                    (NSIndexPath(row: 1, section: 0) as IndexPath)], with: .automatic)
                self.pickerView.reloadAllComponents()
                tableView.endUpdates()

            } else {

                tableView.deselectRow(at: indexPath, animated: true)

                tableView.beginUpdates()
                tableView.deleteRows(at: [
                    (NSIndexPath(row: 1, section: 0) as IndexPath)], with: .automatic)
                tableView.endUpdates()

            }

        case 1:

            if indexPath.row == 0 {

                tableView.deselectRow(at: indexPath, animated: true)

                hideRow(rowName: RowName().units)
                hideRow(rowName: RowName().units3)

                showUnits2PickerView = showUnits2PickerView ? false : true

                if showUnits2PickerView {

                    tableView.beginUpdates()
                    tableView.insertRows(at: [
                       (NSIndexPath(row: 1, section: 1) as IndexPath)], with: .automatic)
                    tableView.endUpdates()

                } else {
                    tableView.beginUpdates()
                    tableView.deleteRows(at: [
                       (NSIndexPath(row: 1, section: 1) as IndexPath)], with: .automatic)
                    tableView.endUpdates()
               }

            } else {

               tableView.deselectRow(at: indexPath, animated: true)

               hideRow(rowName: RowName().units)
               hideRow(rowName: RowName().units2)

               showUnits3PickerView = showUnits3PickerView ? false : true

                if showUnits3PickerView {

                   tableView.beginUpdates()
                   tableView.insertRows(at: [
                       (NSIndexPath(row: 2, section: 1) as IndexPath)], with: .automatic)
                   tableView.endUpdates()

               } else {

                   tableView.beginUpdates()
                   tableView.deleteRows(at: [
                       (NSIndexPath(row: 2, section: 1) as IndexPath)], with: .automatic)
                   tableView.endUpdates()

               }

            }

        default:
            break
        }   
    }
}

1 Ответ

0 голосов
/ 10 февраля 2020

Так что, когда вы нажмете на строку, в вашем didselectmetho. перезагрузите строку. И в вашем cellforRowAtIndexpath поместите некоторое условие, чтобы ячейка не рухнула после перезагрузки.

...