Tableview cellForRowAt indexPath не вызывается после переключения языка в iOS
У меня есть табличное представление, которое работает правильно при запуске приложения. Когда я переключаю язык приложения и нажимаю на текст календаря, он вызывает метод делегата для фильтрации данных, устанавливает флаг и перезагружает таблицу. В табличных методах делегата я проверяю флаг и получаю данные из соответствующего массива. Массив возвращает 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 ответ
Похоже, есть другой объект для просмотра таблицы или около того. Не очень понятно Я решил это с помощью следующего метода.
Вместо звонка 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