Tableview cellForRowAt indexPath не вызывается после переключения языка в iOS - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть табличное представление, которое работает правильно при запуске приложения.Когда я переключаю язык приложения и нажимаю на текст календаря, он вызывает метод делегата для фильтрации данных, устанавливает флаг и перезагружает таблицу.В табличных методах делегата я проверяю флаг и получаю данные из соответствующего массива.Массив возвращает 1 после переключения языка, но затем метод cellforRowAt indexPath не вызывается.

extension CalendarViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (isFilterActive) {
            return filteredData.count  // returns 1 but cellForRowAt is not getting called
        }
        return data.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "calendarCell") as! CalendarCell
        cell.delegate = self
        // ...
    }

}

extension CalendarViewController: CalendarViewDelegate {
    func filterEvent(for date: Date) {
        isFilterActive = true
        var i = 0
        filteredData = []
        filteredImagesData = [:]
        for (idx, val) in data.enumerated() {
            var fromDate: Date?
            var toDate: Date?
            // ..
                filteredData.append(val)
                i = i + 1
            }
        }
        DispatchQueue.main.async {
            self.eventTableView.reloadData()  // <-- filters and calls reload
        }
    }
}

DateViewControllerClass which displays JTAppleCalendarView` имеет значение

class DateViewController: UIViewController {
    let delegate = JSDelegate.shared
    weak var calendarVCDelegate: CalendarViewDelegate?
    @IBOutlet weak var calendarView: JTAppleCalendarView!

    override func viewDidLoad() {
        calendarVCDelegate = self.delegate.getCalendarViewDelegate()
        // ...
    }
    // ...
}

extension DateViewController: JTAppleCalendarViewDelegate, JTAppleCalendarViewDataSource {
    func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) {
        guard let dateCell = cell as? DateCell else { return }
        if (cellState.dateBelongsTo == .thisMonth) {
            dateCell.dateLabel.textColor = UIColor.white
            dateCell.selectedView.isHidden = false
        }
        self.calendarVCDelegate!.filterEvent(for: date)  // <- calls delegate method on date cell tap
    }
}

Я подключил delegate и datasource в раскадровке.У меня есть другие фильтры, и если я выбрал их до переключения языка, то только перезагрузка таблицы работает.Как это исправить?

1 Ответ

0 голосов
/ 14 февраля 2019

Похоже, есть другой объект для просмотра таблицы или около того.Не очень понятноЯ решил это с помощью следующего метода.

Вместо вызова self.eventTableView.reloadData() в методе расширения я отправляю уведомление NotificationCenter.default.post(name: Constants.AppNotification.EventTableViewShouldReload, object: self).Наблюдатель добавляется в viewDidLoad() как NotificationCenter.default.addObserver(forName: Constants.AppNotification.EventTableViewShouldReload, object: nil, queue: nil, using: eventTableViewShouldReload) с помощью метода:

@objc func eventTableViewShouldReload(notif: Notification) {
    print("reload data notif \(CalendarModel.filteredData.count)")
    CalendarModel.isFilterActive = true
    self.eventTableView.reloadData()
}

Я создал класс модели данных для хранения статических переменных, без которых переменные очищаются.

struct CalendarModel {
    static var data:[[String:Any]] = []
    static var filteredData:[[String:Any]] = []
    static var imagesData:[Int:UIImage] = [:]
    static var filteredImagesData:[Int:UIImage] = [:]
    static var isFilterActive = false
}

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

reload data notif 1
numberOfRowsInSection 1
reload data notif 0  <-- called twice
numberOfRowsInSection 0  <-- second one, the filteredData.count is getting 0
cellForRowAt
configureCell
...