我对 tableview.reloadData() 方法有问题(新手问题)

问题描述 投票:0回答:1

我在表视图中重新加载数据时遇到问题。我的应用程序结构有两个容器视图,其中第一个容器视图是集合视图控制器,第二个容器视图是表视图控制器。在集合视图中,我选择单元格,在表视图中我想显示信息。我需要重新加载表视图中的所有数据,因为我可以选择集合视图中的任何单元格。

selectedDay
中,我获取有关在 didSet 中选择的单元格的信息,我向 Firebase (
fetchDataFromFirebase
) 发出请求并获取所选日期的信息。之后,我将数据附加到
workoutList
数组中,并在 didSet 中我需要重新加载所有表视图。

附上我点击 12 号手机并在控制台中获取信息的屏幕截图。

class ScheduleTableViewController: UITableViewController {
    var selectedDay: Day? {
        didSet {
            workoutList.removeAll()
            fetchDataFromFirebase(day: selectedDay?.day ?? "",
                                                        month: selectedDay?.month ?? "",
                                                        year: selectedDay?.year ?? "")
        }
    }
    
    weak var delegate: EmptyDataInSelectedDayProtocol?
    
    private var workoutList = [NewWorkout]() {
        didSet {
            print(workoutList)
            print(workoutList.count)
            tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    // MARK: - Table view data source
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return workoutList.count
    }

    override func tableView(_ tableView: UITableView,
                                                    cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! ScheduleTableViewCell
        cell.configure(in: workoutList[indexPath.row])
        return cell
    }
    
    // Override to support editing the table view.
    override func tableView(_ tableView: UITableView,
                                                    trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
        let reSchedule = UIContextualAction(style: .normal, title: "Change workout day") { [unowned self] action, view, completionHandler in
            workoutList.remove(at: indexPath.row)
            tableView.deleteRows(at: [indexPath], with: .fade)
            completionHandler(true)
        }
        reSchedule.image = UIImage(systemName: "arrow.up.arrow.down")
        reSchedule.backgroundColor = .primary.withAlphaComponent(0.8)
        
        return UISwipeActionsConfiguration(actions: [reSchedule])
    }
    private func fetchDataFromFirebase(day: String, month: String, year: String) {
        FirebaseHelper.shared.getRefenceFirebase()
            .child("\(FirebaseHelper.shared.getUserID())").observe(.value) { [self] snapshot in
                DispatchQueue.main.async { [self] in
                guard let value = snapshot.value as? [String:Any] else {return}
                
                for info in value {
                    let data = value["\(info.key)"] as? NSDictionary
                    
                    guard let userName = data?["userName"] as?  String else {return}
                    guard let trainingStartDate = data?["trainingStartDate"] as? String else {return}
                    guard let trainingTime = data?["trainingTime"] as? String else {return}
                    guard let workoutDuration = data?["workoutDuration"] as? String else {return}
                    guard let selectedColor = data?["selectedColor"] as? [String:Any] else {return}
                    guard let workoutDates = data?["workoutDates"] as? [String] else {return}
                    guard let weekDays = data?["weekDays"] as? [String:Any] else {return}
                    
                    for item in workoutDates {
                        if "\(day).\(month).\(year)" == item {
                            delegate?.isEmptyData(in: false)
                            let workout: [NewWorkout] = [NewWorkout(userName: userName,
                                                                                                            weekDays: weekDays,
                                                                                                            trainingStartDate: trainingStartDate,
                                                                                                            workoutDuration: workoutDuration,
                                                                                                            wortoutTime: trainingTime,
                                                                                                            userColor: [UserColor(red: selectedColor["red"] as? Double ?? 0.0,
                                                                                                                                                        green: selectedColor["green"] as? Double ?? 0.0,
                                                                                                                                                        blue: selectedColor["blue"] as? Double ?? 0.0)],
                                                                                                            workoutDates: workoutDates)]
                            workoutList.append(contentsOf: workout)
                        }
                    }
                }
            }
        }
    }
}
swift uitableview uikit reloaddata
1个回答
0
投票
private var workoutList = [NewWorkout]() {
didSet {
    print(workoutList)
    print(workoutList.count)
    DispatchQueue.main.async {
        self.tableView.reloadSections()
    }
}
}
© www.soinside.com 2019 - 2024. All rights reserved.