【问题标题】:Tableview cellForRowAt indexPath not getting called after language switch in iOS在iOS中语言切换后未调用Tableview cellForRowAt indexPath
【发布时间】:2019-02-13 07:08:52
【问题描述】:

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

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。我有其他过滤器,如果我在语言切换之前选择了它们,那么只有重新加载表才有效。如何解决这个问题?

【问题讨论】:

  • 您是否检查过您的 numberofrows 方法是否被调用?
  • numberOfRowsInSection 正在被调用。
  • 那么你有没有检查从那里返回的值是什么以及 isFilterActive 的值?
  • 两者都符合预期。它返回1 并标记为true
  • 还要交叉检查 tableview 约束

标签: ios swift uitableview delegates arabic-support


【解决方案1】:

看起来 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
}

现在,当表格视图重新加载时,它可以正常工作。如果没有 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

【讨论】:

    猜你喜欢
    • 2020-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多