gpt4 book ai didi

ios - iOS 中语言切换后未调用 Tableview cellForRowAt indexPath

转载 作者:行者123 更新时间:2023-11-29 06:01:07 24 4
gpt4 key购买 nike

我有一个在应用程序启动时可以正常工作的表格 View 。当我切换应用程序语言并点击日历文本时,它会调用委托(delegate)方法来过滤数据,设置标志并重新加载表格 View 。在 TableView 委托(delegate)方法中,我检查标志并从适当的数组中获取数据。语言切换后数组返回 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
}
}

我已经电汇delegatedatasource在 Storyboard中。我有其他过滤器,如果我在语言切换之前选择它们,只有这样表重新加载才起作用。如何解决这个问题?

最佳答案

看起来 tableview 左右有一个不同的对象。不是很清楚。我用下面的方法解决了。

而不是打电话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
}

现在,当 TableView 重新加载时,它可以正常工作。没有 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

关于ios - iOS 中语言切换后未调用 Tableview cellForRowAt indexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54664442/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com