Массив не отображает данные - PullRequest
0 голосов
/ 26 марта 2020

У меня есть объект, который я отображаю в пустой массив строк. Таким образом, я могу заполнить строковые данные, но странно то, что, когда я пытаюсь вставить данные в массив объектов, они показывают данные. В следующем примере я покажу вам, что я имею в виду.

// My view Controller
    var filterClasses = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = #colorLiteral(red: 0.8470588235, green: 0.8470588235, blue: 0.8470588235, alpha: 0.66)

        populateClasses()

        // The array not show up in my tableViewCell
        chooseClass.dropView.options = filterClasses

        // The array show up in my tableViewCell
        // This data is from filter class
        chooseClass.dropView.options = ["8-1", "8-10", "8-2", "8-3", "8-4", "8-5", "8-6", "8-7"]
    }

    private func populateClasses() {
        AddScheduleServices.shared.getListClass { [weak self] result in
            switch result {
            case .success(let classes):
                guard let self = self else { return }
                self.filterClasses = classes.compactMap { $0.name }
                print(self.filterClasses)
            case .failure(let error):
                print(error)
            }
        }
    }

    // This is a custom view from "chooseClass.dropView.options"
    class DropDownView: UIView, UITableViewDelegate, UITableViewDataSource {

    let tableView           = UITableView()
    var options             = [String]()

    var completion: ((String) -> Void)?
    var isHideSchedule      = false

    override init(frame: CGRect) {
        super.init(frame: frame)
        configure()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func configure() {
        translatesAutoresizingMaskIntoConstraints = false
        addSubview(tableView)
        tableView.backgroundColor = #colorLiteral(red: 0.9764705882, green: 0.9764705882, blue: 0.9764705882, alpha: 1)
        tableView.separatorStyle = .none
        tableView.delegate      = self
        tableView.dataSource    = self

        tableView.anchor(top: topAnchor, trailing: trailingAnchor, bottom: bottomAnchor, leading: leadingAnchor, topPadding: 0, rightPadding: 0, bottomPadding: 0, leftPadding: 0, width: 0, height: 0)
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return options.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()

        cell.textLabel?.text = options[indexPath.row]
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        completion?(options[indexPath.row])

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

Я не понимаю, что пошло не так с моим массивом chooseClass.dropView.options. Можете ли вы сказать мне, почему мой массив не отображается в моем виде таблицы?

1 Ответ

1 голос
/ 26 марта 2020

Операция asyn c Полагаю, AddScheduleServices.shared.getListClass, поэтому вам нужно перезагрузить таблицу после выборки данных.

1. обновление options в случае успеха:

private func populateClasses() {
       //...
        case .success(let classes):
            guard let self = self else { return }
            self.filterClasses = classes.compactMap { $0.name }
            self.chooseClass.dropView.options = self.filterClasses // <-- here
        //...
        }
}

2. перезагрузить представление таблицы при установке новых параметров:

class DropDownView: UIView, UITableViewDelegate, UITableViewDataSource {

    //...
    var options  = [String]() {
        didSet {
            self.tableView.reloadData()
        }
    }
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...